プログラミング

【組み込み】makefileのすすめ

組み込みでBuild環境を作るときにmakefileを自作することをおすすめします。

組み込みの場合、コンパイラやOS、CPUのいずれかに統合開発環境がセットになっているので、GUIでBuild対象を選んだりIncludeのパスを設定したりでき、自分自身でmakefileを書くことはほとんどないのではないかと思います。

今回は、あえてそのmakefileを自作することによって得られるメリットを解説します。

makefileとは

makefileの基本構文は以下の通りです。

成果物: 材料
    材料から成果物を作る方法

makefileでは、「成果物」がないとき、または、「成果物」が「材料」よりも古いときに、「材料から成果物を作る方法」を実行することによって「成果物」を作る、というものです。逆に言うと、今の「材料」で作った「成果物」がすでに存在している場合は何も実行しないということです。これがmakefileのいいところで、更新されたファイルに関連するものだけを実行することができます。

あとは、この構造をどんどん繰り返して、材料1から成果物1を作る、成果物1から成果物2を作る・・・とつなげていくことができます。

簡単に具体例も書いておきます。

target.exe: a1.c a2.c
    gcc -o target.exe a1.c a2.c

成果物がtarget.exe、材料がa1.cとa2.c、作り方がgccの行です。a1.cとa2.cからtarget.exeが作られますが、

  • target.exeがないときはgccが実行される
  • target.exeがあるときはgccは実行されない
  • target.exeがあっても、作成後にa1.cかa2.cを更新した場合はgccが実行される

といった動作になります。

makeの環境

私はLinuxのmakeを使用します。

Windows環境の場合、msys2をインストールしてmakeを使用できるようにします。msys2はUNIX系のコマンドが使用できるようになるので便利です。

Cygwinを使用している方もいると思います。私もかなり昔に使用していましたが、すごく面倒だった記憶があるので、今は使用していません。

makefile自作のメリット

makefile自作のメリットは以下の通りです。

  • スクリプトやコマンドなどの挿入が任意の場所でできる
  • 複雑な処理ができる
  • 自動化がしやすい

順番に詳細を見ていきましょう。

スクリプトやコマンドなどの挿入が任意の場所でできる

開発をやっていると、だんだんBuild時に同時にやりたいことが出てきます。

たとえば、

  • Build時に決まる何らかの固定値をプログラムに埋め込む
  • Build中に自動でコードを吐き出すツールを動かす
  • 複数のバイナリファイルを1つにまとめる
  • CDのために生成物をzipにまとめる
  • 必要なファイルを自動で特定の場所からダウンロードしてくる

などといったものです。

そうすると、Buildの途中で、catやzip/unzipなどのコマンドを使用したくなったり、shellスクリプトを書いて実行したりということがしたくなってきます。
(UNIX系のコマンドは便利なものがそろっていて、WindowsでもMsys2を入れておけばだいたい使用できるようになります)

makefileを自作していると、そういった要望に応えやすくなるということです。

統合開発環境の中でも、Build前やBuild後に特定のコマンドを実行することができたりするので、それを利用するというのもありですが、任意の場所で自由に、となるとやはり自分でmakefileを作ってしまうのが早いのかなと思っています。

複雑な処理ができる

  • 1つのmakefileに複数の成果物のコマンドを記載し、コマンドによってAの生成物だけ作る、Bの生成物だけ作る、両方作る、みたいなことができる
  • 1つのファイルを2種類の方法でコンパイルすることができる(例:組み込みのコンパイルとシミュレータのコンパイルを記述)

といったことができます。

1つ目も2つ目もやりたいことは結局一緒なのですが、1つのmakefileで組み込みのBuildだけではなく、シミュレータやテストのコードもBuildできるようにしておきたい、ということです。

統合開発環境だと組み込み用のものしか記述できないので、シミュレータなどを作りたければ結局makefileを作る必要がでてきますね。

自動化がしやすい

CI/CDなどの自動化をしようとすると、CUIからコマンド1つでBuildができる必要があります。

統合開発環境によって変わってくるのだと思いますが、外部からのコマンドを受け付ける口がなかったり、自動生成されるmakefileが特殊なもので、別の環境が必要だったりする可能性があります。

なので、1つの環境で汎用的にBuildができるようにしておくと便利、ということですね。

makefile自作のデメリット

makefile自作のデメリットは、

  • 作るのが大変、面倒

これに尽きると思います。

統合開発環境などでGUIで設定できるようになっているのは、結局楽に作れるようにするためだからですね。

メリットで挙げた点が不要である方、メリットに感じない方はわざわざ自分でmakefileを作る必要はないでしょう。

まとめ

以上、組み込みBuildでmakefileを使用する理由を書いてきました。

私はデメリットで書いた作るのが大変という以上に便利さが勝ると思っているので、今後もこの方針でやっていくと思います。

皆様も、便利な開発環境を作っていく第1歩として、ぜひ活用してほしいです。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA