2012-03-19

Linuxの作法

どうもLinuxにおけるプログラムからのディレクトリの使い方の作法が難しい。

あるプログラムが、動作に設定ファイルとデータファイルを必要とする。これには、Linuxの作法では、それぞれbinとetcとshareを使うようだ。問題は、主要なものだけ挙げても、/binと/usr/binと/usr/local/binがあり、、etcとshareに関してもそれぞれ同じものがあるということだ。もちろん、これらのディレクトリの違いは解説されている。しかし、一体どうやって、どこに置いても正しく動作するプログラムを書けばいいのだろうか。

/usr/binに置かれたプログラムは、やはり/usr/etcを使うべきなのだろうし、/usr/local/binに置かれたプログラムは、/usr/local/etcを使うべきなのだろう。それ以外のディレクトリ下に置かれたプログラムも、やはりそこから見て相対的なetcやshareなディレクトリを使うべきなのだろうか。問題は、そのように振る舞うプログラムをどうやって書けばいいのだろうかということだ。実行可能ファイルが置かれている場所からの相対パスでも使うのだろうか。また、ある名前のディレクトリがどのような目的で使われているかというのは、ディストリごとに微妙に異なる。どうやってポータブルなプログラムを書けばいいのだろうか。すべてのディストロに対応するなどということは、到底小規模なソフトウェアでできそうなことではない。

調べてみると、その手の作業は、autotoolsなどのビルドのためのビルドツールの役割であるらしい。つまり、ソフトウェアはソースコードの型で提供する文化なのだから、コンパイル時にそのような変更をする簡単な方法を提供してやればいい。コンパイルや設定方法などのドキュメントを用意すれば、あとは使用者が自力で設定、コンパイルして使う。ソフトウェアに十分なユーザーがいれば、誰かしら、自分のディストロ用のパッケージなどを作成してくれるだろうから、自力で設定してコンパイルする知識のないユーザーでも、ビルド済みのそのディストロで動くソフトウェアを手に入れられる。

結局、GPLがどうとか、フリーなソフトウェアがどうとかという大義名分とは関係なく、UNIX環境でまともに動くソフトウェアを提供するならば、ソースコードを公開することは至って自然なことのように思える。

まあ少なくとも、プログラマーにとっては便利な環境であるとは言える。ただし、すべてのディストリで動くポータブルでジェネリックなバイナリなどというものを提供することはできない。これは、プログラマーではないユーザーにとっては難しい状況だ。

これを考えるに、LinuxがWindowsやMacを駆逐するということは無理だろう。やはり一般に普及するには、誰か強力な独裁者がひとつの環境を提供する必要がある。androidやUbuntuも、独断的な部分があるからこそ、ある程度の成功をおさめているのだろう。

それにしても、autotoolsを使うのに覚えることが多そうだ。とりあえず必要になるまで学ぶのは保留しておこう。

1 comment:

Anonymous said...

windows linuxどちらでも"make"できるcmakeという選択もあると思います