他の様々なシステムにあるmake
プログラムではサポートしているがGNU make
にはない機能というのは数多くありますが、それらはmake
を取り決めるPOSIX.2 standard(IEEE Standard 1003.2-1992)で要求していないものばかりです。
make
ではこの機能はmake
の内部書式によるアーカイブファイルのシンボルテーブルに知識を取り入れるのにはまずい方法なので、機能を取り入れることはしませんでした。
これについてはアーカイブシンボルディレクトリを更新するの項を見て下さい。
make
では特別な意味合いを持っていて、そのファイルの`~'をはずしたものにあたるSCCSファイルを参照するものです。例えば、`.c~.o'というサフィックスルールでは`s.n.c'というSCCSファイルから`n.o'というファイルを作成することになります。ちゃんと言えばこのようにサフィックスルールをまるごと一続きにしたものが要求されるのです。これについては古いタイプのサフィクスルール(Suffix Rules)の項を見て下さい。
GNU make
では完全な一続きになっている場合はルール連鎖の一般機能の作用でSCCSからファイルを抽出する二つの型ルールとして扱われます。
これについては暗黙ルールの連鎖の項を見て下さい。
make
では`$$@'という文字列が意味するものは、複数のターゲットを持つルールの依存関係において処理中の特定のターゲット、というおかしなものになっています。
これはGNU make
では`$$'は常に普通の`$'が一つある事を表すものであるため、定義されていません。
ですが静的な型ルールを使えばこの機能の効果を得ることが可能です(静的(static)な型ルールの項を参照)。
次のSystem V make
のルールは…
$(targets): $$@.o lib.aGNU
make
では静的な型ルールを用いて次のように置き換えることができます。
$(targets): %: %.o lib.a
make
ではVPATH
の検索(ディレクトリから依存ファイルを探すの項を参照)で発見されたファイルの名前は内部コマンド文字列に変更されたものになります。自動変数を常に使うほうがずっときれいだと思うので、私たちはこれを古い機能としました。
make
では$*
という自動変数がルールの依存関係として出現して、そのルールのターゲットの完全な名前を展開する、という驚嘆不可思議な「機能」を備えています。UNIX make
の開発者がいったい何を考えてこのようにしたのか皆目検討がつきません。$*
の通常の定義としてはまったくの気まぐれなのでしょう。
make
では暗黙のルールの検索(暗黙ルールの利用の項を参照)がコマンドのないものだけではなくてすべてのターゲットに対して行われています。つまりこうすると…
foo.o: cc -c foo.cUNIX
make
では、`foo.o'が`foo.c'に依存していると直感で感じ取ることになります。こんなひどい処理では、壊れているとしか思えません。(少なくともGNU make
では)make
の依存関係プロパティは定義頻度が高く、単純にそういうことをさせるということさえこの仕様にそぐわないのです。
make
はEFLプログラムのコンパイルやプリプロセスに関する暗黙ルールはビルトインではまったくインクルードしませんが、EFLを使っている人がいる方がおられるなら喜んでそれを加えましょう。
make
ではサフィックスルールがコマンドなしで指定されることがあり、空っぽのコマンドを持っているような動作になります(空のコマンドの利用の項を参照)。例えば、
.c.a:…とするとビルトインの`.c.a'サフィックスルールを上書きすることになります。私たちはコマンドのないルールは常に単純にターゲットの依存関係リストに追加させるほうが見栄えがいいと思っています。上の例をGNU
make
でも望む動作にしたいなら次のように簡単に書き換えられます。
.c.a: ;
make
製品では`-k'の影響下以外ではシェルを`-e'フラグで呼び出します(プログラムをテストコンパイルするの項を参照)。`-e'フラグはシェルに非ゼロの返り値を返したプログラムがあれば直ちに処理を抜けさせるものです。私たちは各シェルコマンド行でそれぞれ独立して書いたほうがはっきりするし、こういう特別扱いは必要ではないと考えています。