Engineer's Notebook

コンピュータ関係のTipsやお役立ち情報などをエンジニアが綴ります

アドセンスレスポンシブ


ABテスト横長

【汎用的に使える】便利なmakefileのサンプル

投稿日:2017-09-28 更新日:

普段はVisual StudioなどのIDEを使ってるんですが、場合によってはgcc+makefileを使うこともあります。

特に組み込み向けプログラミングとか。

そんなとき、『あれっ!?Makefileってどう書くんだっけ???』となることがあるので、汎用的に使えるMakefileを作ってみました。
 

Makefileで実現したいこと

まず、Makefileで実現したいことをまとめておきます。

  • 実行ファイル名はフォルダ名からとってきてくれる
  • ソースディレクトリ下のファイルを自動的に列挙してくれる
  • ファイルの依存関係を考慮しつつ、必要最小限のソースをコンパイルしてくれる

IDEなら全部自動でやってくれることですね。
ここまでやっておけば、どんなプロジェクトでもこのMakefileをそのまま使えるようになりそうです。

 

Makefileのサンプル

ということでMakefileのサンプルです。

 

解説

ちょっと解説します。

実行ファイル名は以下のコードで自動的に設定します。

 

makeを実行すると、srcディレクトリ下の.cをサブディレクトリも含めて全てコンパイル対象として列挙します。他の拡張子(.cppとか.asmとか)も対象に加えたい場合はSRCSに追加してください。

また、.exeはobjディレクトリに、.objはobj/src下に生成します。

 

ファイルの依存関係は、gccの -MMD -MPオプションで生成します。

このオプションは、コンパイルと同時にファイルの依存関係を.dファイルとして生成してくれるとても便利なオプションです。.dファイルは.objと同じディレクトリに生成されます。

 

-MMD -MPオプションで生成した.dファイルは、

で読み込みます。

ここのポイントは、MAKECMDGOALSと-(マイナス)です。

MAKECMDGOALSにはコマンドラインで与えて指定されたゴールのリストが入ります。例えば、make cleanを実行した場合は、MAKECMDGOALSにcleanが格納されます。

つまり、上記のコードはmake clean時には.dファイルを読み込まないという意味です。もしifneq~endifがなかったらどうなるかというと、clean実行前に.dファイルを作りに行ってしまいます。無駄ですね。

次に-(マイナス)ですが、これはエラーが発生してもmakeを中断しないという意味です。一番最初のビルド時など、.dファイルが無いのでincludeできずにエラーが発生してしまいます。これでmakeを中断されたら一生ビルドできませんからね。

 

改良ポイント

関連するライブラリが更新されたときにビルドが走るようにしたらもっと便利になるかな?

アドセンス 336x280


アドセンス 336x280


関連コンテンツ

よく一緒に読まれている記事

-ソフトウェア開発
-

Copyright© Engineer's Notebook , 2017 All Rights Reserved Powered by AFFINGER4.