スケッチのビルドプロセス

はじめに

Arduino Unoでのスケッチのビルドの様子を、https://arduino.github.io/arduino-cli/sketch-build-process/を参考にしながら、出力されるソースコードからの推定と、必要な部分はソースコードを読み解いた結果です。

ビルドプロセス

Arduinoソフトウェア(Arduino Uno)を用いてスケッチをビルドしたときは、おおまかに、以下のように処理が進んでいきます。Arduinoソフトウェア(正確には、arduino-builder)は一種のプリプロセッサの役割を果たします。

  1. ソースコードの変換(.inoファイルだけ)
  2. コンパイル
  3. アーカイブ(Arduino coreファイルだけ)
  4. リンク
  5. elf→hex変換

ソースコードの変換

.inoファイルだけは、Arduinoソフトウェア(arduino-builder)が、少しだけソースコードを変換します。具体的には、以下の処理が行われます。

  1. タブを使って複数のファイルがある場合、拡張子が「.ino」のファイルをメインの.inoファイルに追記する。Arduinoソフトウェアを使って新規タブを追加する際、拡張子を指定しなかったファイルは、自動的に「.ino」の拡張子がつくようです。
  2. ファイルの先頭のコメント・プリプロセッサ指令の直後に以下を書き加える。
    1. #include “Arduino.h”
    2. .inoファイル内で定義されている関数のプロトタイプ
  3. もとの.inoファイルの行番号を書き加える。

もとのファイルの行番号を書き加えるのは、コンパイラがエラーを出したときに、対応がつくようにするためだと思います。

また、.inoファイル内で定義されている関数のプロトタイプが自動で付加されるため、自分で書く必要はありません。しかし、.cや.cppで定義した関数のプロトタイプは自動では付加されません。C++/C言語を使い慣れない人向けの措置だとは思いますが、Arudino以外でC++/Cを利用する場合は注意する必要があります。

図で示すと以下のような変換が行われます。

コンパイル

ソースコードがコンパイルされます。コンパイラは、ファイルの拡張子に従い、avr-g++もしくはavr-gccが利用されます。このあたりの実験はこちらのページも参照してください。

ライブラリも同様にコンパイルされます。ただし、ライブラリは各ライブラリ名が付いたディレクトリが作成され、そのディレクトリの中でコンパイルされるようです。このため、ライブラリのソースコードがあるフォルダに、.inoファイルを置いてコンパイルし、かつ、当該ライブラリを利用すると、同一のライブラリファイルが異なるディレクトリにコピーされコンパイルされてしまうため、リンク時に同一の関数や変数が複数定義されているというエラーとなってしまうので、注意が必要です。

アーカイブ

Arduino coreにあるファイル(main.cppやwiring_digital.cなど)は、core.aというファイルにアーカイブされます。

リンク

コンパイルされたファイルは、avr-ldを使ってリンクされ、.elfファイルが作成されます。

elf → hex変換

最後に、.elfファイルを.hexファイルに変換します。変換には、avr-objcopyコマンドが利用されます。

その他

Windowsの場合、デフォルトでは上記の作業は、以下のディレクトリで行われます。具体的なディレクトリは、javaのcreateTempFolder()で生成しているようなので、毎回変化します。作成日付などで判断してください。

C:\Users\ユーザ名\AppData\Local\Temp\arduino_build_30153

このファイルの中にコンパイルに必要なファイルがすべて集められます(必要のないファイルも集まっているように見えます)。

バージョン

Arduino 1.8.15/Arduino Uno

最終更新日

December 25, 2021

inserted by FC2 system