読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【Gentoo】グローバルに指定して構わない USE フラグ

Gentoo Linux

/etc/portage/make.conf*1などでグローバルに USE フラグを設定することが可能です。

他方で、 /etc/portage/package.use などでも、パッケージごとに USE フラグを指定することが可能です。

この双方の用い分けの問題です。

明らかな極論ですが、「全て package.use に書け」と言う人も居ます。

あるいはより単純に考えて、「同じ USE フラグを多くのパッケージで指定していたらグローバルに設定する」という発想は出てくるでしょう。

グローバル USE フラグ

しかし実は、グローバルの USE フラグは、明確に定義されていますUSE Flag Index – Gentoo Linux

これは「Portage ツリー」(gentoo リポジトリ)の中にも書いてあります。 ${PORTDIR}/profiles/use.desc

もっとも、ノングローバルな USE フラグをグローバルに設定しても支障なく動作してしまうので、知らない人が多いと思われます。

ちなみに、 app-portage/flaggieを使えば、ノングローバルな USE フラグをグローバルに設定しようとしたときにはワーニングを出します(けれども、設定自体は可能です)。

他方で、グローバル USE フラグを package.use などで個別に指定することは、なんらの違反も無いと思われます。

グローバル USE フラグの合理性

この定義が合理的なのかは、いささか疑わしいこともあります。

一例としては、何故以下のようになっているのか。合理性というよりも、経緯や製作者の信念のせいという気もします。

  • gtk はグローバル。 gtk2gtk3 はノングローバル
  • qt4qt5 はグローバル。qtqt3support はノングローバル

「いつの時代だ」と言いたくなるようなグローバル USE フラグも少なくありません

  • 3dfx
  • matrox

number9 が無いのが残念です。Graphics Processing Unit - Wikipedia

絶滅危惧種

$ eix -U '^mule$' -\#
app-editors/xemacs
app-xemacs/xemacs-packages-all

2個しか無い!(今は、 xemacs, nemacs, mule などを使っている人がどのくらい居るのやら。 もう、Emacs で済むようになっているんで)

$ eix -U\# matrox
media-tv/freevo

グローバルである意味が無い

USE フラグの整理整頓

インストールしているパッケージが多くなってくると、設定が散らかりがちです。

整理整頓の容易な手段としては、前述の flaggie を用いることです。 ただ、 /etc/portage/make.conf/etc/portage/package.use がディレクトリだったり、 Paludis を使用していたりすると、 flaggie ではうまくいかなかったりします。

そもそもがテキストファイルですから、cut sort uniq grep sed などや、eix を使ったりして、シェルスクリプトを書いて処理をすることは可能です。 これはひとえに、ユーザ当人の能力次第でしょう。

  • スペース区切りとして行の第1項目を抽出
    • cut -d ' ' -f 1
  • スペース区切りとして行の第2項目以降を抽出
    • cut -d ' ' -f 2
  • - で始まる行を - を無視してソートしたいとき
    • sort -d
  • テキストファイfilename をソートして重複を削除
    • cat filename | sort | uniq
  • filename に書き込む
    • > filename
    • | tee filename
  • filename の末尾に追記
    • >> filename
    • | tee -a filename
  • 空白区切りで一個ずつ command に投げ込む
    • | xargs -n1 command
  • USE フラグに ${use} を使用してインストールしているパッケージが無ければ出力
    • eix -q0 --installed-with-use "^${use}$" || echo ${use}

こんな風にいろいろと

for use in $(cat filename) ; do
    grep -q -e "${use} " ${PORTDIR}/profiles/use.desc && echo ${use}
done
for use in $(cat filename) ; do
    eix -q0 --installed-with-use "^${use}$" || echo ${use}
done

*1:Portage の場合。Paludis だと異なります