項6.1. 「設定(config)」で紹介したコマンドのうち、どれか一つを使ってコンフィグレーションを行います。ここではmake menuconfig
を例に説明します。
コンフィグレーションは、大きく次のようにわけることができます。
この中でカーネル設定とベンダー/ユーザ設定は、選択後に一度メニューを終了することで、それぞれの設定画面が自動的に表示されます。
コンフィグレーションは、以下のようにはじめます。
[PC ~/atmark-dist]$
make menuconfig
7.3.1. Main Menu(メインメニュー)
menuconfigを実行するとメインメニュー画面が表示されます。この画面から各サブメニューに移動することができます。
7.3.2. Vendor/Product Selection(ベンダ/プロダクト選択)
ベンダーとプロダクトを選択します。先にベンダーを選択し、その後プロダクトを選択します。
7.3.3. Kernel/Library/Defaults Selection(カーネル/ライブラリ/デフォルト選択)
カーネルやライブラリ、デフォルトの選択を行います。以降のメニューはこのサブメニュー中にあります。
7.3.4. Kernel Version(カーネルの選択)
複数のカーネルをサポートしたプロダクトの場合、ここでビルドするカーネルのバージョンを選択します。アットマークテクノで現在対応しているカーネルは2.6系のLinuxカーネルです。
7.3.5. Cross-dev(開発環境の選択)
複数の開発環境をサポートしたプロダクトの場合、ここでビルドする開発環境を選択します。
7.3.6. Libc Version(Cライブラリの選択)
複数のCライブラリをサポートしたプロダクトの場合、ここでビルドするCライブラリを選択します。選択肢としては、以下の4つが選択対象です。
-
None
-
glibc-GNU Cライブラリ
-
uC-libc
-
uClibc
Noneを選択すると、すでに開発環境にインストールされているCライブラリを使用します。そのほかの選択肢では、atmark-distに含まれているコードをビルドします。
製品によって対応しているライブラリが異なりますので、製品のソフトウェアマニュアルを参照してください。
7.3.7. Default all settings (デフォルトの設定に戻す)
すべての設定をデフォルトの状態に変更します。変更されている設定情報はすべて無くなってしまうので注意が必要です。
7.3.8. Customize Kernel Settings(カーネル設定の変更)
Linuxカーネルのコンフィグレーションを行うか否かを選択します。選択した場合、atmark-distの設定終了後に自動的にカーネルの設定画面が起動されます。
7.3.9. Customize Vendor/User Settings(ベンダ/ユーザ設定の変更)
ユーザーランドのコンフィグレーションを行うか否かを選択します。選択した場合、atmark-distの設定終了後に自動的にユーザーランドの設定画面が起動されます。ユーザーランドのメニューについては次章で説明します。
7.3.10. Update Default Vendor Settings(デフォルトベンダ設定の更新)
現在の設定で、デフォルト設定を更新します。更新した場合、古い設定に戻す方法はありませんので、注意が必要です。
ユーザーランドのメニューは以下のような項目に別れています。ここでは簡単に各項目について説明します。
ベンダー固有の設定を行います。rootfsのinode/block数や、製品固有のアプリケーションを選択できます。
システムとして動作するために必要な基本的なアプリケーションが入っています。システムの初期化を行うinitやユーザ認証のloginなどがこのセクションで選択できます。
7.4.3. Library Configuration
アプリケーションが必要とするライブラリの選択ができます。
フラッシュメモリに関係のあるアプリケーションが選択できます。以降の章で説明するNetflashと呼ばれるネットワークアップデート用アプリケーションがここで選択されています。
7.4.5. Filesystem Applications
ファイルシステムに関係のあるアプリケーションが選択できます。あとの章で説明するFlatfsdはここで選択することができます。その他、mount、fdisk、ext2ファイルシステム、Reiserファイルシステム、Sambaなどが含まれます。
7.4.6. Network Applications
ネットワークに関係のあるアプリケーションが選択できます。dhcpcd-new、ftpd、ifconfig、inetd、thttpdの他にもpppやワイヤレスネットワークのユーティリティなども含まれます。
7.4.7. Miscellaneous Applications
上記のカテゴリに属さないアプリケーションが収録されています。Unixの一般的なコマンド(cp、ls、rm等)やエディタ、オーディオ関連、スクリプト言語インタプリタなどが含まれます。
Busyboxのカスタマイズを行います。Busyboxは複数のコマンド機能をもった単一コマンドで多くの組み込みLinuxでの実績を持っています。Busyboxはとても多くカスタマイズできるため、別セクションになっています。
Tinyloginも複数コマンドの機能をもつアプケーションです。loginやpasswd、gettyなど認証に関係のある機能を提供します。多くのカスタマイズが可能なため別セクションになっています。
MicroWindowsは組み込み機器をターゲットにしたグラフィカルウインド環境です。LCDなどを持つ機器を開発する場合に使えます。
7.4.12. Miscellaneous Configuration
いろいろな設定がまとめられています。SUZAKUのrootユーザのパスワードもここで変更できます。
デバッグ用のオプションがまとめられています。開発中にアプリケーションのデバッグを行うときに選択します。
依存関係の解決が終わったら実際にビルドします。ビルドシステムがすべてを行ってくれるため、開発者はmake
コマンドを入力するだけです。
例 7.1. makeの実行
[PC ~/atamrk-dist]$
make
:
:
[PC ~/atmark-dist]$
ls images
linux.bin linux.bin.gz romfs.img romfs.img.gz
make
コマンドが終了すると、images
ディレクトリにイメージファイルが生成されます。
内部的にどのようにビルドが進み、最終的にイメージファイルになるのかを理解すると、必要とされる部分だけビルドすることもできます。これによりビルドに必要な時間を大幅に短縮できます。また、特定製品向けのカスタマイズを行うためにも、この知識は欠かせないでしょう。
デフォルトのビルドを行うとイメージファイルが作成されますが、この間にたくさんのターゲットが実行されています。デフォルトターゲットのビルドルールは、atmark-dist
ルートディレクトリのMakefile
に以下のように記載されています。
ifeq (.config,$(wildcard .config))
include .config
all: subdirs romfs modules modules_install image
else
all: config_error
endif
デフォルトビルドを実行するとsubdirs, romfs, modules, modules_install, imageの順にビルドが行われるのが分かります。
この流れに沿って、各ターゲットのビルドを説明します。
atmark-distルートディレクトリのMakefileのsubdirsビルドルールを以下に示します。
DIRS = include lib include user
:
:
subdirs: linux
for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH_KERNEL) -C $$dir ||
exit 1 ; done
subdirsターゲットをビルドすると、linux, include lib, include userの順にビルドが行われます。
linuxターゲットは、選択された Linuxカーネルのビルドを行います。atmark-distでは version 2.0、2.4、2.6のカーネルに対応していますが、現在 アットマークテクノの製品では2.6系の Linuxカーネルが対応しています。
libは、ライブラリを収録したディレクトリです。uClibcと glibcは libディレクトリに入っていませんが、コンフィグ時に libディレクトリ内にシンボリックリンクを生成するようになっています。
userは、ユーザーランドアプリケーションを集めたディレクトリです。userディレクトリには専用のMakefileが用意されており、トップレベルのMakefileはそちらに制御を任せるようになっています。
romfsターゲットでは、各ディレクトリに対してromfsターゲットを再帰的に呼びだします。多くの場合、romfs-inst.shをつかって必要なファイルを、atmark-dist/romfsディレクトリにインストールします。
例 7.2. トップレベルMakefileでのromfsターゲット処理
DIRS = include lib include user
:
:
romfs:
$(MAKEARCH) -C $(VENDDIR) romfs
for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir romfs || exit 1 ; done
-find $(ROMFSDIR)/. -name CVS | xargs -r rm -rf
例 7.3. user/Makefileでのromfsターゲット処理
VEND=$(ROOTDIR)/vendors
dir_p = $(ROOTDIR)/prop
dir_y =
dir_n =
dir_ =
:
:
romfs:
for i in $(sort $(dir_y)) $(dir_p) ; do \
[ ! -d $$i ] || make -C $$i romfs || exit $$? ; \
done
Linuxカーネルでは、多くのドライバーなどが moduleという形で分離できるようになっています。このターゲットはLinuxカーネルのビルドシステムにある modulesターゲットを実行します。
上記のターゲットでビルドされたカーネルモジュールを romfsにインストールします。romfs/lib/modules内にインストールされます。
imageターゲットは、プロダクトMakefileの imageターゲットを実行するためのターゲットです。多くのプロダクトでは、カーネルのイメージとユーザーランドのイメージをまとめて、一つのイメージファイルにしています。
直接プロダクトMakefileのターゲットが呼び出されるため、開発者が自由に処理することができます。一般的な流れとしては
-
Linuxカーネルのbinary fileを生成 (elfから binaryに変換)
-
romfsディレクトリからイメージファイルを生成(genext2fsやgenromfsを使用)
-
上記2つのファイルを1つにまとめる
-
NetFlash用にチェックサムなどを生成しバイナリファイルに添付する
と、なっています。