前: Standard Targets, 上: Makefile Conventions


7.2.6 インストールのコマンドの部類

installターゲットを書くとき、三つの部類にそのコマンド全てを分類し なければならない。普通のものと、pre-installationコマンドと、 post-installationコマンドに。

普通のコマンドは適切な場所にファイルを移動し、それらのモードを設定する。 それらはどんなファイルも、完全にそれらが属するパッケージから手に入るもの を除いて、変化させないのが良い。

pre-installationとpost-installationのコマンドは他のファイルを変えても良 い。特に、それらは大域的な設定ファイルやデータベースを編集して良い。

pre-installationコマンドは典型的には普通のコマンドの前に実行され、 post-installationコマンドは典型的には普通のコマンドの後に走らされる。

post-installationコマンドの最も普通の利用はinstall-infoを走らせる ことである。これは普通のコマンドでは行われ得ない。それは、完全には、そし てインストールされるパッケージだけからは手に入らないファイル(Infoディレ クトリ)を変化させる。それはパッケージのInfoファイルをインストールする普 通のコマンドの後に行われる必要があるのでpost-installationコマンドである。

ほとんどのプログラムはpre-installationコマンドを必要としないが、我々はそ れが必要とされる場合にだけその機能を持つ。

install規則のコマンドをこれら三つの部類に分類するために、それらの 中に部類行を挿入しなさい。部類行は次のコマンドの部類を指定する。

部類行はタブと特別なMake変数への参照に加えて、最後に付加的なコメントから 成る。それぞれの部類に対して一つ、使うことができる三つの変数がある。変数 名は部類を指定する。部類行は、これら三つのMake変数は普通未定義(そして、 それらをmakefileで定義するべきではない)ので、普通の実行では何も行 わない。

ここで、それぞれそれが何を意味するのか説明するコメントと共に、その三つの あり得る部類行を挙げる。

             $(PRE_INSTALL)     # Pre-install commands follow.
             $(POST_INSTALL)    # Post-install commands follow.
             $(NORMAL_INSTALL)  # Normal commands follow.

もしinstall規則の始めに部類行を使わないなら、全てのコマンドは、最 初の部類行まで普通のものと分類される。もしどの部類行も使わないなら、全て のコマンドは普通のものと分類される。

これらはuninstallのための部類行である。

             $(PRE_UNINSTALL)     # Pre-uninstall commands follow.
             $(POST_UNINSTALL)    # Post-uninstall commands follow.
             $(NORMAL_UNINSTALL)  # Normal commands follow.

典型的には、pre-uninstallコマンドはInfoディレクトリから項目を削除するた めに使われるだろう。

もしinstalluninstallターゲットがインストールのサブルーチ ンとして振る舞う依存関係を持つなら、それぞれの依存関係のコマンド を部類行で始めるべきで、主要なターゲットのコマンドも部類行で始めるべきだ。 こうして、それぞれのコマンドが、依存関係のそれが実際に走るかどうかに関係 なく、正しい部類に位置するように保証できる。

pre-installationとpost-installationのコマンドはこれら以外のプログラムを 走らせるべきではない。

     [ basename bash cat chgrp chmod chown cmp cp dd diff echo
     egrep expand expr false fgrep find getopt grep gunzip gzip
     hostname install install-info kill ldconfig ln ls md5sum
     mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee
     test touch true uname xargs yes

この方法でコマンドを区別する理由はバイナリ・パッケージを作るためである。 典型的にはバイナリ・パッケージは全ての実行ファイルとインストールされる必 要がある他のファイルを含み、それらをインストールする、それ自身の方法を持 つ—だから、それは普通のインストールのコマンドを走らせる必要がない。し かし、バイナリ・パッケージをインストールすることはpre-installationと post-installationのコマンドを走らせることを必要とする。

バイナリ・パッケージを構築するためのプログラムはpre-installationと post-installationのコマンドを抜粋することによって働く。ここで pre-installationコマンドを抜粋する一つの方法を示す。

     make -n install -o all \
           PRE_INSTALL=pre-install \
           POST_INSTALL=post-install \
           NORMAL_INSTALL=normal-install \
       | gawk -f pre-install.awk

ここでpre-install.awkというファイルは次のものを含む。

     $0 ~ /^\t[ \t]*(normal_install|post_install)[ \t]*$/ {on = 0}
     on {print $0}
     $0 ~ /^\t[ \t]*pre_install[ \t]*$/ {on = 1}

pre-installationコマンドの結果生じるファイルはバイナリ・パッケージをイン ストールすることの一部として、シェル・スクリプトとして実行される。