web-dev-qa-db-ja.com

このMakefileはコンパイラを指定することなくCプログラムをどのように作成しますか?

" Advanced Linux Programming (2001)" [code] という本のMakefileを使用していました。 GNU makeがMakefileでコンパイラを指定することなく、コードを正しくコンパイルするのを見るのは奇妙でした。レシピなしで焼くようなものです!

これはコードの最小バージョンです:

test.c

int main(){}

Makefile

all:            test

本当にうまくいく!これは実行するコマンドです:

cc     test.c   -o test

ドキュメンテーションには何も役に立たなかった。これはどのように可能ですか?


追伸もう1つの注意事項:言語も指定されていません。 test.cを使用できるため、GNU makeccを使用します。存在する場合、test.cppまたはtest.cc(存在する場合)はtest.cではありません)、g++を使用します(c++ではありません)。

42
Ho1

Makeは 組み込みルール を使用してこれを行います。これらは、特にCコードのコンパイル方法と単一オブジェクトプログラムのリンク方法を示します。

実際にはMakefileも必要ありません。

make test

なしで動作します。

これらすべてを可能にする隠しルールを表示するには、-p Makefileなしのオプション:

make -p -f /dev/null

-rオプションは、これらの組み込みルールを無効にします。

alephzero で指摘されているように、Makeには非常に長い間(常にではないにしても)組み込みのルールがありました。 Unix V7でのスチュアートフェルドマンの最初のバージョン files.c 、そして 彼の1979年の論文 はそれらについて言及しています。それらは POSIX仕様 の一部でもあります。 (これは、Makeのすべての実装でサポートされているという意味ではありません。古いBorland Make for DOSでは、少なくともバージョン3.0まではサポートされていません。)

69
Stephen Kitt