コンパイルされたアプリケーションや各種設定ファイルは、Makefile
のromfsターゲットによって atmark-dist/romfs
ディレクトリにインストールされます。アプリケーションが必要とする設定ファイルやデータファイルなども、この時点で atmark-dist/romfs
ディレクトリにインストールされます。
ディレクトリ名に romfs
という名前が使われているのは、多くの組込みシステムでは、デスクトップやサーバ用途の Linuxシステムで使われている ext2やext3、 reiserfs、xfsなどではなく romfs
が使われるためです。しかし、romfs
ディレクトリ自体は romfs
に依存しているわけではありません。後述する jffs2などでも同じromfs
ディレクトリを使います。
romfsディレクトリの構成は、ターゲットシステムが起動したときにターゲットシステム上で見えるディレクトリ構成と同じ構成になっています。romfsディレクトリをルートディレクトリとして、その下にbinやdev、etcなどが配置されます。
atmark-distにはromfs
ディレクトリにファイルを簡単にインストールするためにromfs-inst.sh
と呼ばれるスクリプトが用意されています。このスクリプトはatmark-dist/tools
ディレクトリに入っています。
romfs-inst.sh
は、atmark-dist
ディレクトリにある Makefile
によって ROMFSINSTという変数に代入されます。このため、プロダクトディレクトリをはじめとするatmark-dist内の各ディレクトリの Makefile
では romfs-inst.sh
がどこに入っているかを気にせず、ROMFSINSTという変数で使うのが一般的な方法になっています。
romfs-inst.sh
は、romfs
ディレクトリを指定する環境変数 ROMFSDIRが設定されていない場合、簡単な helpを出力します。
例9.1 romfs-inst.shのヘルプ
[PC ~/atmark-dist]$
tools/romfs-inst.sh
ROMFSDIR is not set
tools/romfs-inst.sh: [options] [src] dst
-v : output actions performed.
-e env-var : only take action if env-var is set to "y".
-o option : only take action if option is set to "y".
-p perms : chmod style permissions for dst.
-a text : append text to dst.
-A pattern : only append text if pattern doesn't exist in file
-l link : dst is a link to 'link'.
-s sym-link : dst is a sym-link to 'sym-link'.
if "src" is not provided, basename is run on dst to determine the
source in the current directory.
multiple -e and -o options are ANDed together. To achieve an OR affect
use a single -e/-o with 1 or more y/n/"" chars in the condition.
if src is a directory, everything in it is copied recursively to dst
with special files removed (currently CVS dirs).
romfs-inst.sh
のコマンド構文は以下のとおりです。
例9.2 romfs-inst.sh構文
romfs-inst.sh [options] [src] dst
[ ]の部分は省略することができます。もし、srcが指定されなかった場合、basename
コマンドが dstに適用されて、戻り値を srcとして使います。romfs-inst.sh
はその値を現在のディレクトリ(つまりプロダクトMakefile
の場合はプロダクトディレクトリ)から探します。
[PC ~]$
basename /foo/bar
bar
もし、srcがディレクトリの場合は、そのディレクトリ以下すべてのファイルとディレクトリをインストールします。ただし、CVS ディレクトリだけはコピーされません。
以下はオプションの簡単な説明です。
- -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-inst.sh
の使用例を説明します。
ファイルをインストールする場合は、以下のようにromfsターゲットをMakefile
に記述します。
romfs:
$(ROMFSINST) src.txt /etc/dst.txt
これは、プロダクトディレクトリ内にある src.txt
を romfs
ディレクトリの中の /etc/dst.txt
にインストールすることを意味しています。もし、romfs
ディレクトリが ~/atmark-dist/romfs
であれば、
~/atmark-dist/romfs/etc/dst.txt
というファイルができあがります。
プロダクトディレクトリにあるsrc.txt
の名前を変更してdst.txt
としておくことで、以下のように簡単に記述することができます。
$(ROMFSINST) /etc/dst.txt
上で簡単にふれましたが、srcが省略されたとき romfs-inst.sh
は dstのbasename
を使ってカレントディレクトリからファイルを探します。
/etc/dst.txt
の basenameは、dst.txt
なので上記の文は
$(ROMFSINST) dst.txt /etc/dst.txt
と同じ意味を持ちます。
ターゲットデバイスに多くのファイルをインストールする場合は、ディレクトリごとインストールすると簡単です。たとえば、ターゲットの/etc
ディレクトリに多くの設定ファイルをインストールする場合などです。
プロダクトディレクトリにetc
というディレクトリを作成し、必要なファイルを置きます。そして Makefile
に以下のように記述します。
$(ROMFSINST) /etc
この例でもsrc
が省略されているので、romfs-inst.sh
は dstの basenameを使います。/etc
の basenameはetcなので、romfs-inst.sh
はプロダクトディレクトリにある etc
というファイルまたはディレクトリを探します。そして今回のようにディレクトリの場合、romfs-inst.sh
はディレクトリ内にあるファイルも一緒にインストールしてくれます。
以下のように treeコマンドを使うと簡単に確認できます。
[PC ~/]$
tree ~/atmark-dist-[version]/vendors/AtmarkTechno/test/etc
:
[PC ~/]$
tree ~/atmark-dist-[version]/romfs/etc
:
もちろん、保存している名前とは別の名前でインストールすることも可能です。
$(ROMFSINST) /etc /var
このコマンドでは、プロダクトディレクトリにあるetc
というディレクトリを romfs/var
にインストールします。
romfs-inst.sh
を使って簡単にリンクを作成することができます。ただし、hard linkと symbolic linkをきちんと理解しなければいけません。
symbolic linkを作成するときは、オプション ‘-s’を使います。例としてa.txt
へのシンボリックリンクを作成してみます。プロダクトMakefile
のromfs
ターゲットは以下のようになります。
romfs:
[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
$(ROMFSINST) /a.txt
$(ROMFSINST) -s a.txt /b.txt
[PC ~/atmark-dist]$
make clean; make romfs
:
:
[PC ~/atmark-dist]$
ls -l romfs
total 0
-rw-r--r-- 1 guest guest 0 Sep 24 05:43 a.txt
lrwxrwxrwx 1 guest guest 5 Sep 24 05:43 b.txt -> a.txt
次はhard linkの例です。オプションは‘-l’を使います。
romfs:
[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
$(ROMFSINST) /a.txt
$(ROMFSINST) -l a.txt /b.txt
[PC ~/atmark-dist]$
make clean; make romfs
:
:
[PC ~/atmark-dist]$
ls -i1 romfs
6077732 a.txt
6296750 b.txt
[PC ~/atmark-dist]$
ls -i1 vendors/AtmarkTechno/test/a.txt
6296750 vendors/ATmarkTechno/test/a.txt
romfs
内にできたb.txt
は、romfs
内のa.txt
へのハードリンクではなく、プロダクトディレクトリにあるa.txt
へのハードリンクということがinodeの番号によってわかります。
ハードリンクの使用は混乱を招きますので、よほどハードドライブの容量に困っていないかぎりお勧めしません。現在の atmark-distでも、romfs内へのhardlinkはあまり使われていないようです。
romfs-inst.sh
を使うことで、すでに存在するファイルに簡単に情報を追記することができます。
構文は以下のようになります。
$(ROMFSINST) -a romfs
romfs:
[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
$(ROMFSINST) -a 'Hello' /a.txt
$(ROMFSINST) -a 'World' /a.txt
[PC ~/atmark-dist]$
make clean; make romfs
:
:
[PC ~/atmark-dist]$
cat romfs/a.txt
Hello
World
romfs-inst.sh
は条件による実行制御が可能です。
$(ROMFSINST) -e
変数名としてよく用いられるのは、CONFIG_ではじまる環境変数です。
romfs:
[ -d $(ROMFSDIR) ] || mkdir -p $(ROMFSDIR)
$(ROMFSINST) -e CONFIG_DEFAULTS_ATMARKTECHNO -a 'Hello' /a.txt
$(ROMFSINST) -e CONFIG_DEFAULTS_UNKNOWN -a 'World' /a.txt
[PC ~/atmark-dist]$
make clean; make romfs
:
:
[PC ~/atmark-dist]$
cat romfs/a.txt
Hello
CONFIG_DEFAULTS_UNKNOWNは定義されていないので条件に当てはまらず、a.txtに「World」の文字列は書き出されません。CONFIG_DEFAULTS_ATMARKTECHNOは、ベンダー名でAtmarkTechnoを選択すると、atmark-dist/.configに定義されます。