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


41

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

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

test.c

int main(){}

メイクファイル

all:            test

そして本当に作品を作ります!これは実行するコマンドです:

cc     test.c   -o test

ドキュメントに有用なものが見つかりませんでした。これはどのように可能ですか?


PS追加の注意事項:言語さえ指定されていません。test.c利用可能であるため、GNU makeはを使用しccます。存在するtest.cpp場合test.cc(またはがない場合test.c)は、g++(ではなく)を使用しc++ます。


4
「レシピなしで焼くようなものです!」レシピでは、水を沸かすように指示されますが、ガスコンロの鍋、誘導ストーブの鍋、電気ケトル、または火の三脚に置かれた大釜を使用して水を沸かすべきではありません。それはあなたがあなたの水を得るべき場所を教えさえしないでしょう。これはmake、水を沸騰させるように指示し、その内部ルールを使用makeする方法に

1
@Rhymoid大声で叫ぶようなものです私はケーキが欲しいです!そして、呼び出されたロボットがmake冷蔵庫をチェックし、使用可能な小麦粉があることを確認し、内部レシピからデフォルトのケーキを焼きます。:-)
Ho1

@ Ho1:ロボットは、どのケーキを飲みたいかと尋ねるかもしれません。:):D
トーシー

回答:


68

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

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

make test

なしで動作します。

このすべてを可能にする非表示のルールを表示するには、-pMakefileなしでオプションを使用します。

make -p -f /dev/null

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


2
私はそう思っていましたが、POSIXはそれらも指定しています
スティーブンキット

5
@KingZoingo Makeは、事実上、一種の推論エンジンです。一連のルール(組み込みおよびMakefileから)、既存のアーティファクト(現在のディレクトリのファイルまたはMakefileで指定されたファイル)、および要求されたアーティファクト( Makefile); 単にルールと既存のアーティファクトを一致させて、それらを使用して要求されたアーティファクトを取得できるかどうかを判断するだけです。組み込みのルールは、test.cを生成するために使用できることを示していtestます。make -d...あなたは詳細にプロセスが表示されます
スティーブン・キット

4
@ Ho1 @StephenKittこれは、makeGNUまたはPOSIXが発明されるずっと前にありました。最初のバージョンは40年近く前に作成されたもので、それ以前にもシェルスクリプトから作成されたプロトタイプバージョンがいくつかありました。
-alephzero

3
@jamesqfはCPP引き続きプリプロセッサを呼び出します(cc -E通常)。C ++コンパイラはCXXです。
スティーブンキット

3
CXXこのコンテキストでの@ Ho1 は、コマンドではなくMake変数です。Makefile 内では、$(CXX)C ++コンパイラを実行するコマンドに置き換えられます。
スティーブンキット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.