Arduino開発ソフトウェアがスケッチをビルドするのに使う手順です。より優の名情報は、Arduinoプラットフォーム仕様を参照してください。以下では、AVRをターゲットとしたときのビルドプロセスを参照しています。他のアーキテクチャでは、類似のプロセスに従いますが、他のツールやコンパイラを使うかもしれません。
概要
Arduinoのコードが、Arduinoボードにアップロードされるまでにはさまざまな出来事が起こります。まず、Arduino開発ソフトウェアが、いくつかの細かい事前処理を行い、スケッチをC++プログラムに変換します。次に、スケッチの依存関係を特定します。その後、コンパイラ(例: avr-gcc)に渡され、人が読めるコードを機械が読める命令(もしくはオブジェクトファイル)に変換します。そして、コードはdigitalWrite()やSerial.print()などの基本的な関数を提供する標準Arduinoライブラリと結合(リンク)します。その結果、一つのIntel Hexファイルになります。このファイルは、Arduinoボードのチップのプログラムメモリに書き込まれる必要がある特定のバイト列を含みます。このファイルは、その後、ボードにアップロード(チップ上のブートローダ―か外部プログラミングハードウェアが、USBかシリアル接続経由で、送信されます)されます。
事前処理
Arduino開発ソフトウェアは、コンパイラ(例: avr-gcc)にスケッチを渡す前に、スケッチを少し変更します。
- スケッチフォルダ内の、すべての.inoと.pdeファイル(Arduino IDEのタブに拡張子なしで表示されます)を、フォルダ名に一致するファイルを先頭に、その後はアルファベット順に結合します。結果のファイルに、.cppというファイル拡張子を追加します。
#include <Arduino.h>が存在しない場合は、スケッチに追加します。このヘッダファイル(現在選択しているボードのcoreフォルダにあります)は、標準Arduinoコアが必要な定義をすべて含んでいます。- .ino/.pdeファイルに関数のうち、プロトタイプ定義がないすべての関数定義のプロトタイプを生成します。希に一部の関数プロトタイプの生成が失敗する場合があります。これに対処するには、これらの関数のプロトタイプを自分で定義してください。
- 警告やエラーメッセージが元のスケッチレイアウトを反映するよう、
#line指令を追加します。
.ino/.pde以外の拡張子をもつ全てのファイルには、事前処理は行われません。また、スケッチ内にある.hファイルは、メインのスケッチファイルからは、自動的にインクルードされません。さらに、.cファイルで定義された関数を、.cppファイル(スケッチから生成されたファイルと同様)から呼び出す場合は、.cppファイルで、その定義をextern "C" {}ブロックでくくる必要があります。
依存関係の解決
依存関係を解決するために、スケッチは再帰的に調べられます。定義済みのインクルードパスがいくつかあります。
- コアライブラリフォルダ(
{build.core}で定義されます) - Variantフォルダ(
{build.variant}で定義されます) - 標準システムディレクトリ(例:
{runtime.tools.avr-gcc.path}/avr/include) - 先の依存関係の解決のために追加されたインクルードサーチパス
依存関係がこれらのどの場所にもない場合は、インストールされたライブラリを探します。詳細は、検索位置の優先度表を参照してください。ライブラリに許可されたサブフォルダの構成は、Arduinoライブラリ仕様を参照してください。-Iオプションは、それぞれのライブラリの依存関係に対して生成され、includesプロパティに追加され、platform.txtのコンパイルレシピで利用されます。
複数のライブラリが#include指令に適合するファイルを含んでいるとき、ルールにより利用ファイルが確定するまで、以下のルールを順に適用して、優先度を決めます。
arduino-cli compileの--libraryオプションを使い指定したライブラリが、他の場所のライブラリより優先します。- アーキテクチャ互換のライブラリが、アーキテクチャ互換でないライブラリより優先します。アーキテクチャ適合を参照。
- ライブラリ名とフォルダ名の双方が適合するライブラリが優先します。
- “ライブラリ名の優先度"か"フォルダ名の優先度"が高いライブラリが優先します。ライブラリ名の優先度とフォルダ名の優先度を参照。
- アーキテクチャに最適化されたライブラリが、アーキテクチャに最適化されていないライブラリに優先します。アーキテクチャ適合を参照。
- 位置優先度の高いライブラリが優先します。位置優先度を参照。
- “closest-match"アルゴリズムを使い、より高得点のフォルダ名のライブラリが優先します。
- フォルダ名がアルファベット順で先のライブラリが優先します。
アーキテクチャ適合
library.propertiesのarchitecturesフィールドが、以下の場合、ライブラリは、アーキテクチャXと適合していると考えられます。
- アーキテクチャXが名に含まれている
- 全てに適合する
*が名に含まれている - 全く指定されていない
library.propertiesのarchitecturesフィールドに、アーキテクチャXが名に含まれる場合、そのライブラリはアーキテクチャXに最適化されていると考えられます。アーキテクチャXに最適化されたライブラリは、そのアーキテクチャに適合しているということを意味します。
例:
| library.propertiesのarchitecturesフィールド | avrとの互換 | avrに最適化 |
|---|---|---|
| 未指定 | YES | NO |
| architectures=* | YES | NO |
| architectures=avr | YES | YES |
| architectures=*,avr | YES | YES |
| architectures=*,esp8266 | YES | NO |
| architectures=avr,esp8266 | YES | YES |
| architectures=samd | NO | NO |
ライブラリ名の優先度
ライブラリ名は、library.propertiesのnameフィールドで定義されています。その値は、インクルードファイル名を比較する際、空白を_に変換することで無害化されます。
ライブラリ名の優先度は、以下のように決定されます(優先度の高い順)。
| ルール | Arduino_Low_Power.hの例 |
|---|---|
| ライブラリ名が100%一致する | Arduino Low Power |
ライブラリ名が100%一致する、ただし、-mainがつく |
Arduino Low Power-main |
ライブラリ名が100%一致する、ただし、-masterがつく |
Arduino Low Power-master |
| ライブラリ名の先頭が一致する | Arduino Low Power Whatever |
| ライブラリ名の後部が一致する | Awesome Arduino Low Power |
| ライブラリ名の一部が含まれる | The Arduino Low Power Lib |
フォルダ名の優先度
フォルダ名の優先度は、以下のように決定されます(優先度の高い順)。
| ルール | Servo.hの例 |
|---|---|
| フォルダ名が100%一致する | Servo |
フォルダ名が100%一致する、ただし、-mainがつく |
Servo-main |
フォルダ名が100%一致する、ただし、-masterがつく |
Servo-master |
| フォルダ名の先頭が一致する | ServoWhatever |
| フォルダ名の後部が一致する | AwesomeServo |
| フォルダ名の一部が含まれる | AnAwesomeServoForWhatever |
位置の優先度
位置の優先度は、以下のように決められます。優先度が高い順。
arduino-cli compileの--librariesオプションで指定されるカスタムライブラリパスにあるライブラリ。- IDEのスケッチかArduino CLIのユーザディレクトリの
librariesサブフォルダにあるライブラリ。 - ボードプラットフォーム/コア(
{runtime.platform.path}/libraries)に含まれるライブラリ。 - 参照ボードのプラットフォーム/コアにバンドルされたライブラリ。
- Arduino IDE(この位置は、Arduino CLIの設定の
directories.builtin.librariesで決定されます)にバンドルされたライブラリ。
Arduino Webエディタでの位置の優先度
Arduino Webエディタでも、位置の優先度は同じです。しかし、クラウドベースなので、ライブラリの位置がわかりにくいかもしれません。
- Custom: インポートされたライブラリ。Libraries > Customタブに表示されます。
- これらのライブラリは、
/tmp/\<some number>/customにあります。
- Pinned: ライブラリの`Include"ドロップダウンメニューで特定のバージョンを選択した、スケッチに関連したライブラリ
- これらのライブラリは、
/tmp/\<some number>/pinnedにあります。 - 注意: “Include"ボタンをクリックしても、ライブラリがスケッチに固定されません。
- Platform bundled: これらはLibraries > defaultタブに表示されます。しかし、ライブラリ名に"for <architecture name>“が付加されています(例: “SPI for AVR”)。
- これらのライブラリは、
/home/builder/.arduino15/packagesにあります。- Board platform bundled
- Core platform bundled
- Built-in:
- Libraries > Defaultタブに表示されるプラットフォームにバンドルされ愛知内ライブラリ。
- Libraries > Library Managerに表示されるライブラリ。
- これらのライブラリは、
/home/builder/opt/libraries/latestにあります。
コンパイル
スケッチは、選択したボードのプラットフォームのboards.txtファイルの変数に従って、アーキテクチャ固有のバージョンのgccとg++によってコンパイルされます。
スケッチは、システムの一時ディレクトリ(例: Linuxでは/tmp)で作成されます。
ビルドプロセスで、ソースファイルとしてみなされるファイルは、.Sと.c、.cppファイル(スケッチの前処理で.inoと.pdeから生成される.cppファイルを含みます)です。ターゲットのソースファイルはコンパイルされ、ビルドディレクトリに、.oファイルが出力されます。メインスケッチファイルや、スケッチの他のソースファイル、スケッチに#includeされたライブラリのソースファイルも同様です。
ソースファイルをコンパイルする前に、それまでにコンパイルされた.oファイルを再利用しようと試みます。特別な.d(dependency: 依存)ファイルがソースによりインクルードされる他の全てのファイルのリストを提供します。.oと.dファイルが存在し、ソースファイルと全ての依存ファイルのタイムスタンプより新しければ、コンパイルはスキップされます。ソースか依存ファイルが修正されているか、ファイルの検証でエラーが出れば、コンパイラは通常通り実行され、新しい.oと.dファイルを書き出します。IDEのボードメニューから新しいボードが選択されると、次のコンパイルではすべてのソースファイルが再構築されます。
これらの.oファイルは一つの静的ライブラリにリンクされ、メインのスケッチファイルがこのライブラリとリンクされます。スケッチに必要なライブラリの部分だけが最後の.hexファイルに含まれ、ほとんどのスケッチのサイズを削減します。
.hexファイルはコンパイルの最終出力で、その後、ボードにアップロードされます。
コンパイル時に詳細出力が有効になっていると、ビルドプロセスで実行された全ての外部コマンドの完全なコマンドラインが、コンソールに出力されます。
アップロード
スケッチは、プラットフォーム固有のツール(例: avrdude)により、アップロードされます。アップロードプロセスも、boardsとメインのpreferenesファイルの変数により制御されます。詳細は、Arduino platform specificationを参照してください。
アップロード時に詳細出力が有効になっていると、デバッグ情報がコンソールに出力され、そこには、アップロードツールのコマンドラインと詳細出力がふくまれています。
オリジナルのページ
https://docs.arduino.cc/arduino-cli/sketch-build-process/
最終更新日
August 16, 2026