makefile4arduino でのファイル分割
arduino タグが付いているけど、Arduino に関しては殆ど触れてません(笑) > 本エントリ
ウェブを彷徨う間に、Arduino IDE には hardware/cores/arduino/Makefile という Makefile 例が付いているらしいという噂をちらほら耳にしていたにも関わらず、結局ゼロから作ることにしたのは、今回ダウンロードした IDE 0018 版には添付されてなかったから古い版を入手するのが面倒、という理由もあるのだけれど(笑)、1つの Makefile に何でもかんでも押し込める書き方が好きじゃない、という理由が大きい。
makefile4arduino では、対象の Arduino デバイスのアーキテクチャ固有情報(= コンパイルオプションとか通信速度とか)を Makefile とは別のファイルに記述しておいて、make コマンド実行時に:
$ make ARCHNAME=atmega328p
みたいな感じで種別指定することで、読み込み対象ファイル=対象アーキテクチャを切り替える、という方式を採用している。
こうすることで、複数アーキテクチャのデバイスに対応する場合でも、Makefile 本体を都度書き換える必要が無くなるので、構成管理の点から見ても都合が良い。変更はするけど commit しない、なんてファイルを長時間抱えるのは気分良くないからね(笑)。
対象アーキテクチャの変更などは、それほど頻度の高い話ではないかもしれないけれど、複数人での開発で、各自の Arduino IDE へのパス設定や、アップロード時のポート指定とかを Makefile に直接書いてしまった場合、ちょっと面倒な話になるよね?というのは、容易に想像できるのではなかろうか?
makefile4arduino の場合、各自の環境に固有な設定も Makefile とは別なファイルに書かれていて、以下の様な感じで切り替えることができる。
$ make ARCHNAME=atmega328p HOSTNAME=myhost
まぁ、そこそこ気の利く開発者なら、オリジナルの Makefile をコピー&編集した自分専用ファイルを -f オプションで明示する、といった手を使うだろうけど、複数アーキテクチャのデバイスをサポートするような場合、更にアーキテクチャ毎に記述を変更した Makefile を作るってのは、少なくとも自分にとっては格好悪い遣り方に見える。
makefile4arduino では、アーキテクチャ/個人環境といった可変要素の記述が別ファイル化されているので、実行時に読み込み対象ファイルを切り替えることで、Makefile 本体を書き換えること無く、任意の組み合わせでのビルド&アップロードが可能になっている。
「コマンド行でいちいち ARCHNAME や HOSTNAME を指定するのが面倒」と言う人が居るかもしれないけど、どうせシェルのヒストリ機能とか、Emacs の M-x compile (これもヒストリ機能が使える)とかを使うことを考えると、それを問題にすること自体に意味が無い。なんせ、CUI 愛好者向けですから(笑) > makefile4arduino