2009-04-07 17 views
8

私はメイクファイルを学習しており、簡単なメイクファイルの作成方法を知っています。私はネストされたmakefileに移っています。ここに私のディレクトリ構造ネストされたメークファイルを作成する

ルート メイクが呼ばれ
/src 
...makefile 
...main.cpp 
...foo 
......makefile 
......foo.cpp 
......foo.h 

あり、それはディレクトリfooというでメイクファイルを呼び出します。ここに私の質問は、私はすべてのオブジェクトファイルをリンクするためのコードを記述するために使用すべき

  1. メイクファイルは何ですか?それがルートメークファイルにある場合は、そこにすべてのオブジェクトファイル名を指定する必要がありますか?
  2. このネストされたメークファイルはベストプラクティスですか?または、ルートにあるメイクファイルを1つだけ持つのは良いですか?

助けがあれば助かります。

答えて

15

これは、ではなく、と言いたいことがたくさんあります。 Recursive Make Considered Harmfulを読んでください。 PDF formにもあります。

短い短いバージョンでは、再帰的なmakeはいくつかの独立した、しかしおそらく重複する依存関係ツリーを効果的に構築し、正しいまたは最大限に効率的なビルドを保証できません。並行して構築することを望むなら、問題は悪化します。

問題を解決するには、上記のすべての問題を解決できるようにする単一の全スパン依存ツリーを構築する単一の非再帰的なmakeを手配します。

+1

そうしないと悪い考えです。代わりに、別の解決策を回答として提示する必要があります。 – deadalnix

+1

うん。この回答は、サイト上で受け入れられなくなった形になっています。編集は部分的に欠損を修復するだけですが、それは何かです。 – dmckee

3

再帰的なmakeは一般的に有害であるとみなされます。

"make"をルートディレクトリに入力し、POSIXメークファイルのみを使用してすべてをビルドできるようにしたい場合は、それが唯一の方法です。その場合は、サブプロジェクトをそれぞれのディレクトリにリンクし、最後のものをルートにまとめてリンクします。

あなたはgmakeの構文を使用して喜んでいる場合は、ここでのMakefileを見てみましょう:http://github.com/singpolyma/theveeb-ecosystem

+1

POSIX(非GNU)makeを使って、非再帰的なビルドを2つの手順に分けて実行することができます:1)すべてのサブディレクトリ内のすべてのmake.incファイルを連結します。 2)結果のメイクファイルを実行します。しかし、ほとんどの人は、とにかくGNU makeを使います。これには "include"ディレクティブがあります。 –

+0

ああ、それは本当です、私は連結のハックのしかし決して。私はインクルードを使う傾向がある。通常は私は非常にPOSIXになりたいですが、メイクファイルを使うと、インクルードディレクティブのためにちょっと毛深いことがあります:) – singpolyma

0

作りやメイクの多くの落とし穴を避けるよりも簡単な構文を持ってSConsような、より近代的なビルドシステムがあります。たとえば、SConsはソースファイルをスキャンしてそれ自身の依存関係を調べますが、makeの場合は依存関係を手動で指定する必要があります。例:新しい#includeステートメントを実装ファイルに追加します。ヘッダーが変更された場合(新しい依存関係を追加しない限り)、その実装ファイルを再コンパイルしません。 SConsは新しい依存関係を自動的に検出し、必要に応じて再コンパイルします。

関連する問題