Atmark Distは、uCLinux-distを元にAtmark Techno製品用に独自に改良したソースコードベースの開発ディストリビューションです。 | uCLinux-dist |
---|
uClinux-distはuClinux.orgが配布する、ソースコードベースの開発ディストリビューションです。 uClinuxとは、MMUを持たないマイクロコンピューターでも動作するように作成されたLinuxです。uClinuxの成果は2.6系のLinuxカーネルに取り込まれています。 uClinux-distは当初uClinux用に作成されましたが、現在のuClinux-distはuClinux専用というわけではありません。設定時に既存のLinuxを選択することでi386やARM、PowerPCのようなMMUをもったCPUにも対応しています。 |
Atmark Distを使うと、Linuxカーネルとユーザーランドのルートファイルシステムを統合して開発することができます。コンフィギュレーションを変更することで、ルートファイルシステムに含むアプリケーションプログラムやライブラリ及びLinuxカーネルの機能を選択できます。また、コマンド一つでそれらをビルドし、フラッシュメモリに書き込める形式のイメージファイルを作成できます。さらに、ユーザー独自のアプリケーションプログラムを追加したり、コンフィギュレーションを保存しておくこともできるので、Armadilloを使った組み込みシステムの構築を容易にします。 Atmark Distを使ってイメージをビルドする基本的な手順は第1部の「開発の基本的な流れ」で述べました。本章では、Atmark Distの詳しい動作や、カスタマイズの方法について説明します。 この章では、Atmark Distのディレクトリ構成について説明します。各ディレクトリの概要を説明するとともに、各ディレクトリに関連した説明がなされている章を紹介します。ディレクトリ構成を理解することは、Atmark Distを用いて開発を行うにあたり、重要なポイントとなります。 Atmark Distのトップディレクトリは、以下のようになっています。 Atmark Distは、makeコマンドによってすべての作業を行います。各ディレクトリにmakefileがあり、ソースコードのビルドなど、指定されたターゲットに対応する処理が記述されています。 atmark-dist/Makefile をトップレベルmakefileと呼び、他のディレクトリにあるmakefileとは区別することにします。トップレベルmakefileは、atmark-distのビルドをコントロールする大事なファイルです。ここで定義されているターゲットは「基本ターゲット」で詳しく説明します。
また、makeコマンドについては、「makeとmakefile」で説明しました。適宜参照してください。 config ディレクトリには設定に必要なスクリプトやmakefileが収録されています。config ディレクトリ内のいくつかのファイルについては、「プロダクトディレクトリのカスタマイズ」で説明します。
tools ディレクトリには、ビルドに必要ないくつかのツールが収録されています。このディレクトリに収録されているromfs-inst.sh はプロダクトディレクトリのmakefileでよく使います。「プロダクトディレクトリのカスタマイズ」で、詳しく説明します。
glibc(GNU C library)とuClibc ディレクトリには、Atmark Distで選択可能なCライブラリのソースコードが収録されています。通常は、開発環境ATDEにインストールされたビルド済みのCライブラリを使用しますので、これらのディレクトリにあるソースコードは使用されません。 このディレクトリにはユーザーランドアプリケーションプログラムのソースコードが収録されています。多くのアプリケーションは、GNU/Linux用のアプリケーションをAtmark Distでも使用できるように変更したものですが、Atmark Dist専用に開発されたものも含まれます。 vendors ディレクトリは以下のようになっています。
vendors ディレクトリの中には、ベンダー名のディレクトリがたくさん入っています。AtmarkTechno ディレクトリもそのうちのひとつです。
ベンダー名のディレクトリの中には、各製品用のサブディレクトリが複数入っています。この製品用のディレクトリをプロダクトディレクトリと呼びます。プロダクトディレクトリには、個々の製品用のイメージをビルドするためのさまざまなファイルが入っています。プロダクトディレクトリについては、「プロダクトディレクトリのカスタマイズ」を参照してください。 vendors/AtmarkTechno ディレクトリ内にはArmadilloをはじめとしたAtmark Distに対応したAtmark Techno社製品用のプロダクトディレクトリがあります。
vendors ディレクトリには、ベンダー名のディレクトリの他にconfig ディレクトリもあります。アーキテクチャごとのデフォルト設定がconfig.arch という名前でそれぞれのディレクトリ内に保存されています。このconfig.arch はプロダクトディレクトリのconfig.arch から参照されています。詳しくは項8.1.「config.arch」を参照してください。
Atmark Distでよくつかうターゲットをここで紹介します。 7.2.1. コンフィギュレーション設定用のターゲットコンフィギュレーションを設定するためのターゲットには、テキストベースとメニューベースの二つ[]が用意されています。表示方法が異なるだけで、両方共Atmark Distのコンフィギュレーションを設定するためのターゲットです。 7.2.1.1. テキストベースでのコンフィギュレーション設定(config)configターゲットを指定すると、テキストベースでコンフィギュレーションを設定できます。標準イメージを作成するような簡単なコンフィギュレーションを選択するときに便利です。 第1部の「Atmark Distを使ったルートファイルシステムの作成」「ソースコードの取得」で説明したように、Atmark DistとLinuxカーネルのソースコードを取得して、それぞれシンボリックリンクを作成し、atmark-dist ディレクトリでmake
configを実行すると、以下のように表示されます。 まず、ターゲットとなるボードのベンダー名を質問されます。ベンダー名は、vendors ディレクトリ以下にあるディレクトリ名で指定します。「AtmarkTechno」と入力してください。 次に、ボード名を質問されます。選択したベンダーのディレクトリにあるプロダクトディレクトリの名前で指定します。例として、Armadillo-420を入力します。独自のプロダクトディレクトリを追加している場合は、そのディレクトリ名を指定してください。 続いて、ターゲットのアーキテクチャを指定します。通常は、「default」のままにします。Enterキーを入力してください。 使用するCライブラリを選択します。 通常は「None」のままにしてください。「None」を選択すると、開発環境にインストールされているビルド済みのCライブラリを使用します。Enterキーを入力してください。 これまで選択してきたコンフィギュレーションの設定を標準にするかどうか質問されます。y(Yes)と入力してください。 標準のイメージと同じイメージを作成するには、最後の3つの質問はn(No)と答えてください。「Customize Kernel Settings」にy(Yes)と答えると、Linuxカーネルのコンフィギュレーションを変更することができます。また、「Customize Vendor/User Settings」にy(Yes)と答えると、ルートファイルシステムに含めるアプリケーションプログラムやライブラリを選択することができます。 すべての質問に答え終わると、コンフィギュレーションが反映されます。 7.2.1.2. メニューベースでのコンフィギュレーション設定(menuconfig)menuconfigターゲットを指定すると、メニュー画面を使ってコンフィギュレーションを設定することができます。 | メニュー画面の描画 |
---|
menuconfigターゲットを指定した場合のメニュー画面はNcurses(new curses、テキストベースのユーザーインターフェースを作成するためのライブラリ)を使って描画されます。このターゲットが指定されたときに画面などをコントロールするプログラムをビルドするため、Ncursesのライブラリとヘッダファイルが必要になります。ATDEでは、Ncurses用のパッケージがあらかじめインストールされているので必要ありませんが、自前で環境を用意した場合はインストールしてください。 |
make menucnfigを実行すると、図7.12「menuconfig: Main Menu画面」のような画面が表示されます。メニュー画面によるコンフィギュレーションの設定方法は、「コンフィギュレーションの設定」で詳しく説明します。 cleanターゲットはAtmark Dist内で作成された中間ファイル等を削除し、きれいにするためのターゲットです。Atmark Distには以下の2種類のcleanターゲットが用意されています。 表7.1 Atmark Distのcleanターゲット ターゲット | 内容
|
---|
make clean | サブディレクトリをクリーンし、romfsディレクトリおよび、imagesディレクトリ内のファイルを削除します。 | make distclean | すべての中間ファイルなどを削除して、Atmark Distを初期状態にします。現在のコンフィギュレーションも削除されます。 |
allターゲットは、atmark-distのデフォルトターゲットです。makeコマンドをオプションなしで実行することで、このターゲットが実行されます。allターゲットでは、必要なソースコード(カーネル、ユーザーランドアプリケーション、ライブラリ)のビルドを行い、Armadilloに書き込むことができるイメージファイルを生成します。詳しくは「ソースコードのビルドとイメージファイルの作成」で説明します。 Atmark Distでイメージファイルを作成する際の全体的な流れは、以下に示す手順になります。 まず、atmark-dist ディレクトリでmake menuconfigを実行することで、コンフィギュレーションの設定を開始します。コンフィギュレーションの設定画面では、まず、ベンダーとプロダクトを選択します。続いて、設定初期化を行うか、カーネル又はユーザーランドのルートファイルシステムのカスタマイズを行うかを選択します。カスタマイズを行うことを選択した場合、それぞれのコンフィギュレーションを設定します。コンフィギュレーション設定画面を終了すると、設定が反映されます。 コンフィギュレーションを正しく設定したあとmakeコマンドを実行すると、イメージファイルの作成を開始します。コンフィギュレーションに従って、必要なソースコードのビルド、ルートファイルシステムの作成、イメージファイルの作成を自動でおこないます。 以降の章では、それぞれの手順を詳しく説明していきます。 Atmark Distを使ってイメージファイルを作成する手順は、大きく以下の二つに分けられます。 - コンフィギュレーションの設定
- ソースコードのビルドとイメージファイルの作成
ここではその前半部分、コンフィギュレーションの設定方法について説明します。説明は、make menuconfigを使ったメニューベースのコンフィギュレーション設定画面を用いて行います。設定画面では、表7.2「menuconfigの操作方法」に示すキー操作で画面の操作を行います。 表7.2 menuconfigの操作方法 キー操作 | 動作 |
---|
↑↓キー | メニューの選択 | ←→キー | 動作の選択 | スペースキー | オプションの選択 | Enterキー | 動作の決定 |
設定画面は、以下に示す階層構造になっています。 以下、それぞれの設定について説明していきます。 まず初めに、ベンダーとプロダクトを選択します。この作業は、他の設定の前に行う必要があります。 atmark-dist ディレクトリでmake
menuconfigを実行すると、「Main Menu」画面が表示されます。「Main Menu」画面で「Vendor/Product Selection」を選択すると、「Vendor/Product Selection」画面へ移動します。
最初に、ベンダーを選択します。「Vendor/Product Selection」画面で「(SnapGear) Vendor」という行を選択すると、「Vendor」画面に移動します。AtmarkTechno社製品を使用する場合、「Vendor」画面で「AtmarkTechno」を選択してください。 次に、プロダクトを選択します。「Vendor/Product Selection」画面の「(Armadillo-210.Base) AtmarkTechno Products」という行を選択すると、「AtmarkTechno Products」画面に移動します。「AtmarkTechno Products」画面では、使用するプロダクトを選択してください。独自プロダクト用のプロダクトディレクトリを追加していた場合、ここにディレクトリ名が表示されますので、それを選択してください。 「Vendor/Product Selection」画面で「Exit」を選択すると、「Main Menu」画面に戻ります。そのまま「Exit」を選択して、「Do you wish to save your new kernel configuration?」画面で「Yes」を選択すると、選択したプロダクトの標準のコンフィギュレーションが適用されます。コンフィギュレーションを変更したい場合は、「ユーザーランドコンフィギュレーションの変更」や「カーネルコンフィギュレーションの変更」を参照してください。 7.4.2. ユーザーランドコンフィギュレーションの変更ユーザーランドのコンフィギュレーションを変更すると、ユーザーランドのルートファイルシステムにどのアプリケーションプログラムやライブラリを含めるか選択することができます。 ユーザーランドのコンフィギュレーションを変更するには、「Main Menu」画面で「Kernel/Library/Defaults Selection」を選択して「Kernel/Library/Defaults Selection」画面へ移動し、「Customize Vendor/User Settings」にチェックを入れ、Main Menuを終了してください。 すると、続いて「Userland Configuration」画面が表示されます。 「Userland Configuration」画面のメニューは以下のような項目に分かれています。 表7.3 Userland Configurationメニュー一覧 セクション | 説明
|
---|
Vendor specific | ベンダー固有の設定を行います。ルートファイルシステムのサイズや、製品固有のアプリケーションを選択できます。 | Fonts | ユーザーランドに組み込むフォントを選択できます。 | Core Application | システムとして動作するために必要な基本的なアプリケーションが入っています。システムの初期化を行うinitやユーザー認証のloginなどがこのセクションで選択できます。 | Library Configuration | アプリケーションが必要とするライブラリの選択ができます。 | Flash Tools | フラッシュメモリに関係のあるアプリケーションが選択できます。netflashと呼ばれるネットワークアップデート用アプリケーションもここで選択できます。 | Filesystem Applications | ファイルシステムに関係のあるアプリケーションが選択できます。flatfsdはここで選択することができます。その他、mount、fdisk、ext2ファイルシステム、Sambaなどが含まれます。 | Network Applications | ネットワークに関係のあるアプリケーションが選択できます。dhcpcd-new、ftpd、ifconfig、inetd、thttpdの他にもpppやワイヤレスネットワークのユーティリティなども含まれます。 | Miscellaneous Applications | 上記のカテゴリに属さないアプリケーションが収録されています。Unixの一般的なコマンド(cp、ls、rm等)やエディタ、オーディオ関連、スクリプト言語インタプリタなどが含まれます。 | Busybox | BusyBoxのカスタマイズを行います。BusyBoxは多くのカスタマイズができるため、別セクションになっています。 | Tinylogin | TinyloginはBusyBoxのように複数コマンドの機能をもつアプリケーションです。loginやpasswd、gettyなど認証に関係のある機能を提供します。多くのカスタマイズが可能なため別セクションになっています。 | Qt | QtはC++言語で書かれたアプリケーションフレームワークです。Qtを使うことで、比較的簡単にクロスプラットフォームなGUIアプリケーションの開発ができるようになります。 | X Window System | X Window SystemはLinuxで一般的に使われるGUI環境です。ここでは、KDriveというX Window Systemの亜種についての設定が行えます。 | MicroWindows | MicroWindowsは組み込み機器をターゲットにしたグラフィカルウィンドウ環境です。LCDなどを持つ機器を開発する場合に使えます。 | Games | ゲームです。説明はいらないですよね。 | Miscellaneous Configuration | いろいろな設定がまとめられています。 | Debug Builds | デバッグ用のオプションがまとめられています。開発中にアプリケーションのデバッグを行うときに選択します。 |
ルートファイルシステムに含めたいアプリケーションプログラムやライブラリにはチェックを入れ、含めたくないもののチェックを外してください。 選択が完了したら、「Userland Configuration」画面で「Exit」を選択してください。「Do you wish to save your new kernel configuration?」画面が再度表示されますので、設定を反映する場合には「Yes」を選択してください。 7.4.3. カーネルコンフィギュレーションの変更カーネルのコンフィギュレーションを変更すると、カーネルに含めるデバイスドライバなどの機能を選択することができます。 カーネルのコンフィギュレーションを変更するには、「Main Menu」画面で「Kernel/Library/Defaults Selection」を選択して「Kernel/Library/Defaults Selection」画面へ移動し、「Customize Kernel Settings」にチェックを入れ[]、Main Menuを終了してください。 すると、続いて「Linux Kernel Configuration」画面が表示されます。 「Linux Kernel Configuration」画面のメニューは以下のような項目に別れています。 表7.4 Linux Kernel Configurationメニュー一覧 セクション | 説明
|
---|
Patch physical to virtual translations at runtime | 仮想・物理のアドレス変換関数にパッチを適用します。物理メモリーのベースが16MB境界にあるARMアーキテクチャに対応するためのものです。 | General setup | カーネル全般に渡る設定を行います。 | Enable loadable module support | 機能を有効にするかを含め、カーネルモジュールに関する設定を行います。 | Enable the block layer | ブロックレイヤーを有効にするか選択します。ブロックレイヤーを無効にすると、ブロックデバイスを使用できなくなります。 | System Type | システム依存の設定を行います。Armadillo-400シリーズのボードオプションの設定もここで行います。 | Bus support | PCMCIA/PCカードバスを有効に関する設定を行います。 | kernel Features | ハイレゾリューションサポートの設定など、カーネルの機能に関する設定を行います。 | Boot options | ブート時の挙動に関する設定を行います。標準のカーネルオプションはここで設定できます。 | CPU Power Management | CPUの電源管理に関する設定を行います。 | Floating point emulation | 浮動小数点演算をエミュレートする機能の設定を行います。ABIをEABIにする場合は必要ありません。 | Userspace binary formats | カーネルがサポートするユーザーランドで動作するプログラムのフォーマットを選択します。 | Power management options | 電源管理機能に関する設定を行います。 | Networking support | ネットワーク機能に関する設定を行います。 | Device Drivers | カーネルで有効にするデバイスドライバを選択します。多くの場合設定する必要があるのは、このセクションでしょう。 | File systems | カーネルがサポートするファイルシステムを選択します。 | Kernel hacking | 主にカーネルのデバッグ用の設定です。 | Security options | セキュリティ機能に関する設定を行います。 | Cryptographic API | カーネルで有効にする暗号APIを選択します。 | Library routines | カーネルで有効にするライブラリルーチンを選択します。 | Virtualization | 仮想化機能に関する設定を行います。 |
カーネルに含めたい機能にはチェックを入れ、含めたくないもののチェックを外してください。 選択が完了したら、「Linux Kernel Configuration」画面で「Exit」を選択してください。「Do you wish to save your new kernel configuration?」画面が再度表示されますので、設定を反映する場合には「Yes」を選択してください。 7.4.4. コンフィギュレーションの変更を元に戻す「ユーザーランドコンフィギュレーションの変更」や「カーネルコンフィギュレーションの変更」で変更したコンフィギュレーションを元に戻すには、「Main Menu」画面で「Kernel/Library/Defaults Selection」を選択して「Kernel/Library/Defaults Selection」画面へ移動し、「Default all settings (lose changes)」にチェックを入れ、Main Menuを終了してください。 ベンダーとプロダクトはそのままで、標準のコンフィギュレーションに戻ります。 変更したコンフィギュレーションをプロダクトディレクトリに保存し、それを標準のコンフィギュレーションとすることができます。この機能は「Atmark Distがアップデートされた場合」で使用します。 コンフィギュレーションを保存するには、「Main Menu」画面で「Kernel/Library/Defaults Selection」を選択して「Kernel/Library/Defaults Selection」画面へ移動し、「Update Default Vendor Settings」にチェックを入れ、Main Menuを終了してください。 「Kernel/Library/Defaults Selection」画面では、開発環境とCライブラリを選択することもできます。これらは、通常変更する必要はありませんので、標準の設定を使用してください。 「Kernel/Library/Defaults Selection」画面で「Cross-dev」を選択すると、開発環境を選択できます。開発環境を変更することで、異なるABIやアーキテクチャ用のバイナリを生成することができます。 選択できる開発環境は、プロダクトごとに決まっています。開発環境としてArmadilloで選択できる項目は以下の通りです。 表7.5 開発環境 項目 | 内容 |
---|
default | プロダクト毎の標準設定を使用 | arm-vfp | OABIでVFP[]用命令を使用したバイナリを生成 | arm | OABIのバイナリを生成 | armel | EABIのバイナリを生成 |
「Kernel/Library/Defaults Selection」画面で「Libc Version」を選択すると、どのCライブラリを使用するか指定できます。以下の4つが選択対象です。 「None」を選択すると、開発環境にインストールされているCライブラリを使用します。それ以外を選択すると、Atmark Distに含まれているソースコードをビルドして使用します。通常は、「None」を選択してください。 7.5. ソースコードのビルドとイメージファイルの作成本章では、前章で設定したコンフィギュレーションに従って、ソースコードをビルドしイメージファイルを作成する手順について説明します。 ソースコードをビルドしイメージファイルを作成することを、「Atmark Distをビルドする」と表現することにします。 Atmark Distをビルドすると言っても、すべてをビルドシステムが行ってくれるため、ユーザーはmakeコマンドを実行するだけです。 ビルドが正常に完了すると、images ディレクトリにイメージファイルが作成されます。linux.bin がカーネルの、romfs.img がユーザーランドのイメージファイルです。gzで終わるファイルが、それぞれを圧縮したものです。通常は、圧縮されたイメージファイルをArmadilloに書き込みます。 デフォルト(all)ターゲットのビルドを行うと、イメージファイルが作成されますが、この間にたくさんのターゲットが実行されています。Atmark Distでは、すべてを一度にビルドするのではなく、対象を指定してそれだけをビルドすることもできます。修正を行った部分だけをビルドしなおすといったことができるので、ビルド時間を大幅に短縮できます。 デフォルトターゲットのルールは、トップレベルmakefileに以下のように記載されています。 デフォルトターゲットを指定してビルドすると tools、subdirs、preromfs、romfs、modules、modules_install、imageの順にビルドが行われるのが分かります。この流れに沿って、各ターゲットで行われている処理を説明します。 まず最初にビルドシステムとして動作するために必要なツールを作成します。多くはスクリプト言語で書かれているためビルドは必要ありませんが、中にはC で書かれたものもあります。 romfs を処理する前にやっておかなければならない処理をするためのターゲット。現在は、romfs/ を削除することだけが記述されています。これがないと、古い romfs/ の情報が残ってしまいます。all のように全部ビルドし直すときは削除する方が無難です。 他のターゲットから依存されていないので、romfs/ にファイルを入れてmake images とし、手で入れたファイルが入った romfs.img.gz を作成しても影響はありません。 subdirsターゲットのルールは、トップレベルmakefileに以下のように記述されています。 subdirsターゲットはlinuxターゲットに依存しているため、まずlinuxターゲットのルールが適用されます。linuxターゲットでは、Linxuカーネルのビルドを行います。 subdirsターゲットのルールでは、lib 、include 、user 、VENDDIR (プロダクトディレクトリ)の各ディレクトリを順にビルドします。 lib ディレクトリは、ユーザーランドのライブラリを収録したディレクトリです。uClibcとglibcはlib ディレクトリに入っていませんが、コンフィグ時にlib ディレクトリ内にシンボリックリンクを生成するようになっています。
include ディレクトリは、インクルードファイルを収めたディレクトリです。allターゲットのルールが適用されると、ビルドしたライブラリのインクルードファイルへのシンボリックリンクを作成します。
user ディレクトリは、ユーザーランドのアプリケーションプログラムを集めたディレクトリです。user ディレクトリには専用のMakefile が用意されており、トップレベルmakefileはそちらに制御を任せるようになっています。
最後に、プロダクトディレクトリのビルドが行われます。 romfsターゲットでは、各ディレクトリに対してromfsターゲットを再帰的に呼びだします。多くの場合、romfs-inst.shを使って、必要なファイルをatmark-dist/romfs ディレクトリにインストールします。romfs-inst.shについては「romfsインストールツール(romfs-inst.sh)」で説明します。 romfs ディレクトリ以下のディレクトリ構成は、ターゲットシステム上で見えるディレクトリ構成と同じ構成になっています。romfs ディレクトリをルートディレクトリとして、その下にbin やdev 、etc などのディレクトリが配置されます。
ディレクトリ名にromfs という名前が使われているのは、Atmark Distの元となったuClinux-distが対象としていた組み込みシステムでは、romfsファイルシステムが使われることが多かったためです。しかし、romfs ディレクトリ自体は、romfsに依存しているわけではありません。Armadillo-400シリーズでは、ユーザーランドのルートファイルシステムはext2です。 各ディレクトリのromfsターゲットの処理が完了した後、もし、ベンダーディレクトリのatmark-dist/Common/tools ディレクトリにlib-inst.shとauto-strip.shがあり、それらを使用するように設定されていた場合、以下の処理が行われます。 lib-inst.shを使用して、romfs ディレクトリにある実行ファイルが使用する共有ライブラリをromfs ディレクトリにインストールします。開発環境としてarmelを選択していた場合、ATDE5では/usr/arm-linux-gnueabi/lib ディレクトリ以下にあるARM EABI用の共有ファイルを使用します。 | 注意: 自動でインストールされないライブラリ |
---|
動的ロードされるライブラリは、lib-inst.shでは検出できないため、romfs ディレクトリにインストールされません。プログラム中でライブラリを動的ロードしている場合は、使用するライブラリをromfs-inst.shを使うなどして明示的にromfs ディレクトリにインストールする必要があります。 |
続いて、auto-strip.shを使用して、romfs ディレクトリにある実行ファイルに対して、stripコマンドを適用します。stripコマンドはオブジェクトファイルの不要なシンボルを削除し、ファイルサイズを小さくします。 Linuxカーネルでは、ドライバーなどをカーネルモジュールとしてLinuxカーネルから分離した形で作成することができるようになっています。modulesターゲットでは、Linuxのビルドシステムにmodulesをmakeターゲットとして渡し、カーネルモジュールをビルドします。 7.5.2.6. modules_installターゲットmodules_installターゲットでは、Linuxビルドシステムで作成されたカーネルモジュールをromfsにインストールします。カーネルモジュールはromfs/lib/modules ディレクトリに置かれます。 imageターゲットは、イメージファイルを作成するためのターゲットです。トップレベルmakefileでは、単にプロダクトディレクトリにあるMakefile のimageターゲットを呼ぶだけになっているので、実際の処理はそちらに書かなければなりません。 通常、以下の処理を記述します。 - Linuxカーネルのイメージファイルを生成。
romfs ディレクトリからユーザーランドのルートファイルシステムのイメージファイルを生成。- NetFlash[]用にチェックサムなどを作成し、イメージファイルに添付する。
イメージファイルは、images ディレクトリに作成されます。 ビルド対象を特定するために指定可能なターゲットを以下にまとめます。 - linux: Linuxカーネルをビルドします
- lib: ライブラリをビルドします
- user:
user ディレクトリのアプリケーションプログラムをビルドします - romfs:
romfs ディレクトリにファイルをインストールします - modules: Linuxカーネルモジュールをビルドします
- modules_install: Linuxカーネルモジュールを
romfs ディレクトリにインストールします - image: イメージファイルを作成します
7.5.3. romfsインストールツール(romfs-inst.sh)romfs-inst.shは、romfs ディレクトリへのファイルのインストールを簡単にするスクリプトです。このスクリプトは、atmark-dist/tools ディレクトリにあります。 romfs-inst.shのパスは、トップレベルmakefileでROMFSINSTという変数に代入されています。そのため、プロダクトディレクトリをはじめとする各ディレクトリのmakefileでは、romfs-inst.shがどこにあるかを気にせず、ROMFSINSTという変数で使用できます。 romfs-inst.shは、romfs ディレクトリを指定する環境変数ROMFSDIRが設定されていない場合、簡単なhelpを出力します。 romfs-inst.shのコマンド構文は以下のとおりです。 options とsrc は省略可能です。もし、src が指定されなかった場合、basenameコマンドがdst に適用され、戻り値をsrc として使用します。
options が指定されなかった場合、romfs-inst.shは、現在のディレクトリ[]にsrc に指定された値と名前が一致するファイルがあった場合、そのファイルをromfs ディレクトリにコピーします。もし、src と名前が一致するディレクトリがあった場合、そのディレクトリ以下のすべてのファイルとディレクトリをコピーします。ただし、CVSディレクトリはコピーされません。
options を指定することで、単純なコピー以外の処理をさせることができます。options には、以下のものが指定できます。
表7.6 romfs-inst.shのオプション オプション | 内容
|
---|
-v
| 実際に実行した内容を出力 | -e env-var
| env-var がyのときだけ、指定されたアクションを実行
| -o option
| option がyのときだけ、指定されたアクションを実行
| -p perms
| chmod方式でdst のパーミッションを指定 | -a text [-A pattern ]
| text をdst に追加。-A pattern が指定されているときは、pattern がdst に含まれていない場合にtextを追加
| -l link
| dst で指定された名前で、link へのハードリンクを作成
| -s sym-link
| dst で指定された名前で、sym-link へのシンボリックリンクを作成
|
単純にファイルをコピーする場合は、romfsターゲットを以下のようにmakefileに記述します。 これは、makefileがあるディレクトリにあるsrc.txt を romfs ディレクトリ以下の/etc/dst.txt にインストールすることを意味しています。もし、romfs ディレクトリがatmark-dist/romfs であれば、atmark-dist/romfs/etc/dst.txt というファイルができあがります。 src.txt の名前を変更してdst.txt としておくことで、以下のように簡単に記述することができます。
src が省略された場合、romfs-inst.shはdst にbasenameコマンドを適用して、src の値とします。
/etc/dst.txt にbasenameコマンドを適用するとdst.txt となるので、上記のルールは以下と同じ意味を持ちます。
romfs:
$(ROMFSINST) dst.txt /etc/dst.txt 多くのファイルをコピーしたい場合は、ディレクトリごとコピーすると簡単です。たとえば、ターゲットの/etc ディレクトリに多くの設定ファイルをコピーする場合などです。 makefileがあるディレクトリにetc という名前でディレクトリを作成し、必要なファイルを置きます。そしてmakefileに以下のように記述します。 この例でもsrc が省略されているので、romfs-inst.shはdst にbasenameコマンドを適用します。/etc にbasenameコマンドを適用するとetcとなるので、romfs-inst.shはmakefileがあるディレクトリ内のetc というファイルまたはディレクトリを探します。そして今回のようにディレクトリの場合、romfs-inst.shはディレクトリ内にあるファイルとディレクトリをすべてインストールしてくれます。 もちろん、別の名前のディレクトリとしてでインストールすることも可能です。 このコマンドでは、makefileがあるディレクトリ内のetc というディレクトリをatmark-dist/romfs/var にコピーします。 romfs-inst.sh を使うと、単純なファイルやディレクトリのコピーだけでなく、リンクを作成することもできます。
シンボリックリンクを作成する場合は、-s オプションを指定します。例として、ターゲットのルートディレクトリ直下のa.txt へのシンボリックリンクをb.txt という名前で作成する場合、以下のようになります。 このルールを記述してmake romfsを実行すると、結果は以下のようになります。 ハードリンクを作成する場合は、-l オプションを指定します。 しかし、このように指定した場合、romfs ディレクトリ内にできたb.txt は、同じromfs ディレクトリ内のa.txt ではなく、makefileがあるディレクトリのa.txt へのハードリンクとなります。 ハードリンクの使用は混乱を招きますので、よほど開発環境の容量に困っていないかぎりお勧めしません。現在のAtmark Distでも、romfs 内へのハードリンクはあまり使用していません。 -a オプションを指定すると、ファイルへ文字列を追記できます。
構文は以下のようになります。 以下のように記述すると、atmark-dist/romfs/a.txt には、「Hello」と「World」が一行ずつ記述されます。 -e オプションを指定すると、条件が一致した場合だけインストールを実行することができます。
構文は以下のようになります。 変数名 に指定した変数の値がyまたはYの場合だけ、コマンドを実行します。変数名
とは、CONFIG_で始まる環境変数がよく用いられます。CONFIG_で始まる環境変数には、対応するコンフィギュレーションが選択されたときにyが代入されますので、特定のコンフィギュレーションが選択されているときだけインストールしたい場合に使用されます。
プロダクトディレクトリには、プロダクト専用のアプリケーションプログラム、設定ファイル、コンフィギュレーションファイルなどを置くことができます。Armadilloをベースに独自のプロダクトを開発する場合、使用するArmadiilo用のプロダクトディレクトリをコピーして、独自プロダクト用のプロダクトディレクトリとすることで、設定や管理が楽になります。 7.6.1. プロダクトディレクトリに含まれるファイルプロダクトディレクトリには、最低限以下のファイルが必要です。 Makefile config.arch config.vendor-3.x tools/config-linux.conf
Makefile には、デフォルト(all)、clean、distclean、romfs、imageターゲットを記述する必要があります。それぞれのターゲットでどのような処理を行うべきかは、「基本ターゲット」や「詳細なビルドの流れ」を参照してください。
config.arch ファイルには、アーキテクチャに依存した設定を記述します。実際には、アーキテクチャごとにデフォルトの値がすでに用意されているため、上書きする設定だけを書けばよいようになっています。
config.vendor-3.x ファイルには、ユーザーランドコンフィギュレーションの標準設定を記述します。現在のユーザーランドコンフィギュレーションは、atmark-dist/.config に保存されています。図7.20「コンフィギュレーションを保存する」の手順を実行すると、atmark-dist/.config ファイルがプロダクトディレクトリのconfig.vendor-3.x ファイルにコピーされます。
tools/config-linux.conf には、Linuxカーネルの標準コンフィギュレーションファイルを記述します。最初にカーネルコンフィギュレーションを設定する際、このファイルで指定されたファイルに記述されたコンフィギュレーションを使用します。現在のカーネルコンフィギュレーションは、atmark-dist/linux-3.x/.config ファイルに保存されています。図7.20「コンフィギュレーションを保存する」の手順を実行すると、atmark-dist/linux-3.x/.config ファイルがプロダクトディレクトリのconfig.linux-3.x ファイルにコピーされます。
| サフィックス「-3.x」,「-2.6.x」のついたファイル |
---|
プロダクトディレクトリ内にあらかじめ用意されているファイルには、config.vendor-3.x のように「-3.x」や「-2.6.x」のサフィックスのついたファイルが存在します。サフィックス「-3.x」のついたファイルは linux-3.x のカーネルを使用したときのみ使用され、サフィックス「-2.6.x」のついたファイルはlinux-2.6.x のカーネルを使用したときのみ使用されます。 |
Atmark Distを使用して独自プロダクトを開発する場合、まずはベースとなるArmadillo用のプロダクトディレクトリをコピーして、独自プロダクト用のプロダクトディレクトリとしてください。基本的に、プロダクトに依存するすべての変更作業は、このディレクトリ内で行います。 ここではArmadillo-420をベースとしてmy-product という名前のプロダクトディレクトリを作成します。 Armadilloを使用した組み込みシステムを開発するにあたり、ほとんどの場合、独自のアプリケーションプログラムを作成することになるでしょう。ここでは、独自に作成したアプリケーションプログラムをAtmark Distに追加する方法を紹介します。 プロダクトディレクトリ以下に、アプリケーション用のディレクトリを作成します。ここではhello とします。 ソースコードを作成し、hello ディレクトリに追加します。以下の内容を、hello ディレクトリにhello.c という名前で追加してください。 hello.c をコンパイルするためのmakefileを作成し、hello ディレクトリに追加します。以下の内容を、hello ディレクトリにMakefile という名前で追加してください。
7.6.3.4. プロダクトディレクトリのmakefileを修正プログラムを追加した場合、プロダクトディレクトリのmakefileを変更する必要があります。 atmark-dist/vendors/AtmarkTechno/my-product/Makefile には、SUBDIR_yという変数が用意されています。この変数にアプリケーションプログラム用のディレクトリ名を追加してください。
| 作成したディレクトリをSUBDIR_yに追加します。 |
プロダクト専用のアプリケーションプログラムを追加する手順は以上です。makeコマンドを実行すると、実行ファイルhello を含んだユーザーランドのイメージファイルが作成されます。 プロダクトディレクトリには、アプリケーションプログラムのソースコードだけでなく、ルートファイルシステムに含めたい設定ファイルやデータファイルなども置くことができます。 Armadillo-420ディレクトリをベースにプロダクトディレクトリを作成した場合、プロダクトディレクトリ以下のetc 、home 、usr ディレクトリ内にあるファイルやディレクトリはromfsディレクトリにコピーされるようになっています。この時、ファイル名に付加された「-3.x」等のサフィックスは削除されます。[]通常は、これらのディレクトリに設定ファイルやデータファイルを置くとよいでしょう。 etc 、home 、usr ディレクトリ以外の場所にファイルやディレクトリを追加したい場合、プロダクトディレクトリのmakefileを変更する必要があります。例として、var ディレクトリ内のファイルとディレクトリをすべてromfs ディレクトリにコピーした場合、atmark-dist/vendors/AtmarkTechno/my-product/Makefile を以下のように修正してください。
LinuxカーネルやAtmark Distは機能追加やバグ修正などで随時アップデートがおこなわれます。この章では、プロダクトの開発中に新しいAtmark DistやLinuxカーネルがリリースされた場合の対応方法について説明します。 7.7.1. Atmark Distがアップデートされた場合新しいAtmark Distがリリースされた場合、コンフィギュレーションを保存して、プロダクトディレクトリをまるごと新しいAtmark Distにコピーするだけで、コンフィギュレーションを引き継いだまま、移行することができます。 例として、新しいバージョンのAtmark Distをatmark-dist-new 、古いバージョンのAtmarkDistをatmark-dist-old というディレクトリでホームディレクトリの下に作成しているものとして説明します。また使用しているプロダクトは、ベンダー名をAtmarkTechno、プロダクト名をmy-productと設定しているものとします。 まず、make cleanを実行して、古いバージョンのAtmark Distの不要なファイルを削除します。 次に、古いバージョンのAtmark Distのコンフィギュレーションを保存します。「コンフィギュレーションの保存」の手順を実行してください。コンフィギュレーションファイルは、プロダクトディレクトリに保存されます。 以上で、古いバージョンのAtmark Distの準備は完了です。 新しいバージョンのAtmark Distのソースコードを取得して展開し、atmark-dist-new ディレクトリとしてください。atmark-dist-new ディレクトリには、通常どおり、linux-3.x という名前でLinuxカーネルのソースコードディレクトリのシンボリックリンクを張ります。 新しいバージョンのAtmark Distのvendors/AtmarkTechnoディレ
クトリ に古いバージョンで使用していたプロダクトディレクトリをコピーします。 新しいAtmark Distのatmark-dist-new ディレクトリでmake menuconfigを実行し、古いバージョンからコピーしたプロダクトを選択します。 my-productを選択し、コンフィギュレーション設定画面を終了すると、Atmark Distは自動的にプロダクトディレクトリにあるコンフィギュレーションファイルを読み込みます。 デフォルト設定を読み込み中に新しいAtmark Distで追加されたコンフィギュレーションがあれば、それをどのように設定するか尋ねられます。設定を入力しEnterを押してください。デフォルトの設定を選択する場合は、何も入力せずEnterを押してください。以下に、追加された項目があった場合の設定例を示します。 | mjpg-streamerの設定をおこないます。[N/y/?]は入力できる値を示しています。「y」を入力してEnterを押すと、mjpg-streamerを有効に、「n」を入力してEnterを押すとmjpg-stremaerを無効に設定します。「?」を入力してEnterを押すとヘルプが表示されます。入力できる値が大文字になっている値はデフォルトの設定値であることを示しています。 |
新しいコンフィギュレーションがあった場合は、選択した設定を保存するために、再度「コンフィギュレーションの保存」を実行してください。 7.7.2. Linuxカーネルがアップデートされた場合新しいLinuxカーネルがリリースされた場合、コンフィギュレーションを保存して、Linuxカーネルのソースコードディレクトリへのシンボリックリンクを差し替えるだけで、コンフィギュレーションを引き継いだまま、移行することができます。 この章では例として、新しいバージョンのLinuxカーネルをLinux-3.14-at-new とし、古いバージョンのLinuxカーネルをLinux-3.14-at-old として説明します。 まず、make cleanを実行して、Atmark Distの不要なファイルを削除します。 次に、古いLinuxカーネルのコンフィギュレーションを保存します。「コンフィギュレーションの保存」の手順を実行してください。コンフィギュレーションファイルは、プロダクトディレクトリに保存されます。 古いバージョンのLinuxカーネルのソースコードディレクトリへのシンボリックリンクを削除します 新しいバージョンのLinuxカーネルのソースコードディレクトリへのシンボリックリンクを作成します。 make menuconfigを実行して標準のコンフィギュレーションを読み込みます。図7.19「コンフィギュレーションの変更を元に戻す」の手順を実行してください。 新しいカーネルで追加されたコンフィギュレーションがあれば、それをどのように設定するか尋ねられます。設定を入力しEnterを押してください。デフォルトの設定を選択する場合は、何も入力せずEnterを押してください。以下に、新しく追加された項目があった場合の設定例を示します。 | Size of 1 qTD's bufferの設定をおこないます。[2048]は入力できる値が数字であり、デフォルトの値が2048であることを示しています。値を入力せずEnterを押した場合はデフォルトの値になります。 |
新しいコンフィギュレーションがあった場合は、選択した設定を保存するために、再度「コンフィギュレーションの保存」を実行してください。 | |
|