16

私が取り組んでいる小さなプロジェクトのためにGNUMakeを学ぼうとしています。これまでのところ、「基本的な」チュートリアルでさえかなり大雑把に見え、makefile の構文をまだ理解していません。

まったくの初心者が GNUMake に慣れるための優れたリソースを持っている人はいますか?

4

6 に答える 6

15

決定的なガイドはhttp://www.gnu.org/software/make/manual/make.html
です。詳細な説明があるオライリーな本「Managing Projects with GNU Make」があります。以前のエディションを使用することもできます。それらは GnuMake を具体的にカバーしていませんが、はるかに薄いです。

Make は開発者の間では汚い秘密です。誰もそれを理解していません。他の誰かから make スクリプトを借りて、それを変更するだけです。ゼロから作成されたスクリプトは 1 つだけだと思います (おそらくツールの作成者によって)。

単純な例以上のことを行う必要がある場合、ほとんどの人は Ant のような最新のビルド システムに切り替えるか、Perl/Python/etc で独自のビルド システムを作成します。

于 2008-10-20T22:32:23.663 に答える
4

makeの最も一般的に使用される機能は、いくつかの単純な概念、ターゲット、依存関係、および変数に分解できます。

ターゲットは構築したいものですが、ターゲットの下にあるコマンドはコンパイラコマンドまたはスクリプトにすることができます。通常、各ターゲットはコード内のモジュールを参照しますが、プロジェクトに合わせてこれらを細かくすることができます。

依存関係は、プロジェクト内のファイルまたはその他のターゲットです。これの最良の例は、一連のオブジェクトファイルからバイナリを構築しているCプロジェクトの場合です。バイナリをビルドする前に各オブジェクトファイルが存在する必要があるため、makeはすべての依存関係が完了するまでターゲットをトラバースし、ターゲット全体に対してコマンドを実行します。

変数は必ずしも必要ではありませんが、コンパイラフラグなどを処理するのに非常に便利です。正規の例は、CCおよびCCFLAGであり、使用しているコンパイラ、つまりgccおよび-ansi-Wall-o2などのフラグを参照します。

より一般的なヒントとコツ:

  • コマンドの前には[tab]文字を入力する必要があります。そうしないと、コマンドは実行されません。これはmakeの古い遺物であり、なぜそうなのか思い出せません。
  • 慣例により、すべてのターゲットを含めて、デフォルトにするターゲットを指定することができます。これは、複雑なmakefileがあり、常にデフォルトにしたい特定のターゲットがある場合に役立ちます。
  • makefileはmakefileまたはMakefileと呼ばれる必要がありますが、別の名前を付ける場合は、$ make-f[makefilename]を使用します。
  • 常に完全な変数展開構文を使用してください。つまり、$(VARIABLE)を使用しないと、makeが必要なコマンドを出力しない場合があります。
  • makeは再帰的に動作する可能性があるため、プロジェクト内にディレクトリ内に存在するサブモジュールが多数ある場合は、make内からサブディレクトリmakefileでmakeを呼び出して、それぞれをビルドできます。
  • インストールスクリプトなどを必要とする非常に複雑なプロジェクトがある場合は、makefileを生成し、ライブラリの存在やその他の移植性の問題をチェックするための一連のトリックを実行するautotoolsも調査することをお勧めします。
于 2008-10-20T22:59:17.930 に答える
2

オライリーの本の提案に同意します。

Make に関する役立つヒント、コツ、洞察については、Mr. Make の記事を参照してください。

于 2008-10-20T23:21:56.667 に答える
0

私は GNU 情報システムの大ファンではありませんが、GNU の make 情報ページが非常に役立つことがわかりました。非常に基本的な概念と、利用可能なものの大まかな種類を理解したら、たとえば、事前に作成された関数などの情報を参照するには、情報ページが最も簡単な方法であることがわかりました。

(GNUinfoプログラムは忘れて、pinfo代わりに eg を使用してください。)

于 2012-07-06T04:37:21.890 に答える
0

mgb:それはさらに悪いことです。私は以前、複雑な make システムをゼロから作成したことがあります (数千のファイル、50 または 100 のディレクトリ、4 または 5 のコンパイラとクロスコンパイル ターゲット、2 つの OS など)。私は座って、最初に gnu make を徹底的に学び、システムを設計し、最初にプロトタイプをいじりました。私たちは皆、その結果にとても満足していました。

しかし、それは何年も前のことです。私が今日それらをどのように書いているか知っていますか?あなたが説明するのと同じ方法。それはかなり面倒で、構文の詳細は十分に曖昧であり、かなり定期的に行わない限り、詳細を思い出すことができません. 直観的でない構文といくつかの風変わりなルールを持つ他の言語と同じように、私は推測します。

于 2008-10-20T22:50:19.507 に答える