7

ある時点で、同僚と私は、xmega チップ用の組み込みコードを作成するための「サンプル」makefile をネットから入手しました。この経験は非常に苛立たしいものでした。私たちのどちらも専門家ではなく、せいぜい初心者です。時折微調整/調整を行うことで取得します。私たちは何時間もかけてマニュアルを読み、ダーツを投げて、より深刻な変更を試みます。

通常、ビルドするときは、常にクリーンな状態から始めます。自動依存生成は確実に機能しないようで、この方法の方が安全であることがわかりました。これは組み込みプロジェクトであるため、小さなプロセッサでは、コンパイルは実際に飛ぶ. それは瞬く間に行われ、ここで私の本当の質問につながります:

依存関係の管理やインクリメンタル ビルドの活用に make を使用していない場合、単純なシェル スクリプトの代わりに make を使用する意味はありますか?

私は、C コード、Python、古き良き bash スクリプトを書くことに自信を持っています。今日の最近の不満は、FreeRTOS に関連する少数のソース ファイルをサブディレクトリに移動しようとしたことです。make の唯一の本当の利点は、OSX に標準でインストールされていることと、vi と QtCreator と XCode が makefile と統合できることです (ただし、ここでブリッジする非常に最小限の makefile を作成できます)。

4

6 に答える 6

17

Make は、ソフトウェアを構築するための由緒あるエキスパート システムです。それは今でも重く広く使われているので、学ぶ価値があります。幸運にも、ほぼ瞬時にビルドできるプロジェクトを現在持っているかもしれませんが、私の経験では、これは例外であり、規則ではありません。

依存関係の追跡とアクションの推論が Make の目的であることを考えると、それを単なるバッチ システムとして使用することは得策ではなく、ツール (Make) の使用方法を学習するのにも役立ちます。

あなたの投稿から、サブディレクトリで Make を使用することに違反したようです。おそらく差し迫った問題を解決することはできませんが、このペーパー: Recursive Make Considered Harmfulは、状況を説明するのに役立ち、Make 自体の操作についての洞察を与えることができます。

Make は依存関係を自動的に生成しません。GNU Make の依存関係を自動的に生成する方法については、ネット上に多数のリソースがあります。OSX が GNU Make を使用するのか BSD Make を使用するのか (または BSD バリアントがまだ存在する場合でも) はわかりません。後者 (BSD) の場合は、BSD バリアントの依存関係を自動的に生成する方法のレシピを見つけることができると確信しています。

この投稿で私が推測するより実存的な質問は、次のとおりです。プロジェクトにすぐに利益をもたらさない場合、この古いツールを学習する価値はありますか?

答えとして、あなたの小さなプロジェクトは、このツールを学ぶ絶好の機会です。インクリメンタル コンパイルが実際に時間を節約するプロジェクトに直面した場合、痛みのしきい値ははるかに高くなります。

JamSConsRakeなどの Make を置き換える、またはメタ makefile ジェネレーターとして機能する他の多くのビルド システムがあります: CMake、一部の IDE。置き換えの数が非常に多いということは、多くの人が Make を不適切だと感じていることを示しています (または、場合によっては単に不快なだけかもしれません)。

ただし、Make の知識が少しあれば、近い将来に役立つ可能性があります。また、ビルド システムがどのように機能するか、およびルールの生成と依存関係の追跡に関連する問題を理解するための最初の (または最も明白な) ステップである可能性もあります。

幸運を祈ります。

于 2013-01-03T01:26:24.827 に答える
2

これは私が少し前に自分自身に設定した質問です。個人的には、Pythonスクリプトを使用してAVR用のコードをコンパイルしています(リンク)。私はメイクの専門家ではありませんが、ある程度の経験はあります。それでも私はそれがイライラしていると思います、そしてあなたがとにかくすでに専門家でない限り、uCの必要性は無価値です。

誰かにそうすることをお勧めするわけではありませんが、Python(Perl、Ruby、Bash ...)で同じ依存関係チェックを実装することを妨げるものはなく、おそらくもっと強力です。私はそれが言語の選択またはあなたが快適に感じるものの問題であると信じています。makeは単なるプログラミング言語の一種であり、初心者にはかなりわかりにくいように思われるかもしれません。

于 2013-01-03T11:35:17.010 に答える
2

システムのサイズに関係なく、個人的には make を直接使用することはなかったでしょう (つまり、まれに、非常に小さなシステムで make を使用できたということです)。Makefile を生成するツールを使用していたでしょう。もちろん、ストック OS の一部にインストールされているものは失われますが、多くの頭痛の種は解消されます。

個人的には、cmake と autotools をご覧になることをお勧めします。個人的には cmake の方が好きで、素晴らしいと思いますが、autotools は頭痛の一部を取り除きますが、いくつかの新しいものを追加します。ただし、どちらもmakefileよりも優れていると思います。

Cmake には、よりクロス プラットフォームであるという利点もあり、makefile、ビジュアル スタジオ ファイル、code::block ファイルなどを作成できます。また、完全なアウト オブ ソース ビルドもサポートしています。つまり、_build フォルダーを作成して、そこからビルドできます。これにより、ソース ツリーを汚染する代わりに、生成されたすべてのファイルが _build フォルダーに配置されます。

編集:あなたの質問に答えるには:基本的なメイクファイルを学び、それが何をするかを理解します。しかし、その後、私は切り替えたでしょう。だから私はmakeを学びますが、それを使いません。

于 2013-01-03T11:48:21.460 に答える
2

単一のコンパイル単位ではない重要な C プログラムは、それ自体に依存関係があり、ほとんどすべてがシステム ライブラリに依存しています。

毎回クリーン ビルドを実行するスクリプトを作成するつもりがない限り、ワークフローを正常に保つために何らかの依存関係管理ツールが必要です。

makeは標準的な選択であり、最初に依存関係ルールを自動的に生成する方法を見つけることができれば、仕事に適しています。

QT ビルド システム自体は Makefile と統合されず、プロジェクトのより高いレベルの記述から作成されます。 QTCreatorは、このプロセスに関する GUI を提供する多くのツールの 1 つです。内部からコンパイルするQTCreatorと、実際にMakefile呼び出されるのは結果です。qmakeを使用して、XCode および Visual Studio ワークスペース ファイルを生成することもできます。

QT ビルド システムは、クロス コンパイルを処理するように設定するのが比較的簡単なため、QT を使用しない場合でも、実際には組み込みプロジェクトにかなり適しています。

于 2013-01-03T01:19:55.190 に答える
1

IDE を使用している場合を除き、make は、この種のことを行うための事実上のツールです。あなたの場合、それはやり過ぎだと思います。

自動依存関係の生成はややこしいですが、一般的に Web で有効なレシピを見つけることができます。具体的にどのような問題が発生したかはわかりませんが、別の質問をする価値があるかもしれません。

あなたのニーズには bash スクリプトで十分かもしれません。それが本当なら、それのために行きます。あなたが Python に慣れているなら、SConsのようなものも見たくなるかもしれません。

私はかなりの量の Makefile 作業を行いましたが、Rake に移行する過程にあります。私のニーズに合うようにボンネットの下にある Ruby のパワーは、make よりも優れていると思います。

于 2013-01-03T01:07:08.390 に答える
0

毎回フルビルドを実行している場合、makeを使用して毎回まったく同じコマンドシーケンスを実行しても、実際の利点はありません。ただし、makeは非常に強力なシステムであり、それを回避するのは間違いです。Makeは、カスタムの「pythonビルドスクリプト」と一緒に考えられるよりもはるかに多くのことを追加します。

  1. このプロジェクトが最初からすばやく構築できるほど小さい場合でも、すぐに大きなものに取り組むことになります。Makeは、複雑なユースケースよりも単純なユースケースの方が簡単に習得できます。「自動依存関係の生成は確実に機能しないようです」とあなたは言います。依存関係を正しく定義すれば、makeは非常に信頼できます。したがって、設定に間違いがあるはずです(これについては以下で詳しく説明します)。

  2. Makeは、常に最初からビルドする場合でも便利です。小さなビルドスクリプトを手作りする代わりに、同じシンボリック変数によって制御されるすべてのビルド関連コマンドのコンテナーとしてMakefileを使用できます。のような変数がありALLSOURCE、zipファイルやctagsインデックスなどを作成する疑似ターゲットで使用できます(make cleanこの方法でも機能します)。すべてに個別のバッチスクリプトを作成すると、プロジェクトの進展に合わせてスクランブリングで更新することになり、理由もなくディレクトリが乱雑になります。

しかし、依存関係を確実に機能させることはできません、とあなたは言います。他の誰かのサンプルスクリプトから始めるのは間違いだったのではないかと思います。おそらく、必要のないことをやりすぎて、完全には理解していません。クリーンなMakefileから始めて、生成するバイナリのターゲットを追加し、独自の依存関係を記述します。単純にする; プロジェクトの構築が非常に簡単で、独自のスクリプトを実行することを考えている場合でも、そのプロジェクトのmakefileを簡単に作成できるはずです。行き詰まった場合は、ここで具体的な質問をしてください。

于 2013-01-26T20:45:08.273 に答える