Armadilloフォーラム

netflash のビルドエラーに関して

goto.yuichiro

2016年4月28日 12時40分

後藤です。

過去に同様の問題が報告されていますが、こちらでも同じ問題が発生しました。
こちらで確認した再現方法と、ビルドエラーの対処方法を共有いたします。

使用ソースコード

Atmark Dist は atmark-dist-20160126
Linux カーネル は linux-3.14-at6

再現方法

Atmark Dist、Linux カーネルのソースコードを展開し、Armadillo-420 向けに設定を
行った後、make を実行し ROM イメージをビルドします。

次に、Armadillo-440 向けに設定を行い、make を実行しますと、netflash でビルド
エラーが発生します。

netflash.c:55:26: fatal error: linux/blkmem.h: そのようなファイルやディレクトリはありません

プロダクトは Armadillo-420 と Armadillo-440 の2つしか確認していませんが、他
のプロダクトでも同様だと思われます。

対処方法

netflash のビルドエラーが発生した際、Atmark Dist 内に配置されています
include/linux/autoconf.h を削除し、それを Linux カーネルソース内の
include/generated/autoconf.h へのシンボリックリンクとします。その後、再度
make を実行します。

$ cd /home/atmark/atmark-dist-20160126
$ rm include/linux/autoconf.h
$ ln -s /home/atmark/atmark-dist-20160126/linux-3.x/include/generated/autoconf.h include/linux/autoconf.h
$ make

※ Atmark Dist のバージョンは、使用しているバージョンに読み替えてください。

ビルドエラーが発生する原因

まず前提として、netflash のソースコード netflash.c は、Linux カーネルのコン
フィグで CONFIG_MTD が有効になっていないと、存在しないヘッダーファイル
linux/blkmem.h をインクルードすることになりビルドエラーが発生します。

Armadillo-4x0 シリーズのカーネルはデフォルトで COFIG_MTD を有効にしていますの
で、通常は netflash.c でビルドエラーは発生しません。

Linux カーネルのコンフィグ結果は、Linux カーネルソース内の
include/generated/autoconf.h へ出力され C プログラムからインクルードして
利用できるようになっていますが、Atmark Dist では Atmark Dist 内の
include/linux/autoconf.h を Linux カーネルソース内の
include/generated/autoconf.h へのシンボリックリンクとし、Linux カーネルのコン
フィグを必要とする C プログラムは、シンボリックリンクの方をインクルードして使
用しています (netflash.c も同様です)。

上記で言及したシンボリックリンクは、Atmark Dist でプロダクトの設定を行い、
make を実行しますと、その過程で作成されますが、make 完了後、別のプロダクトの
設定を行うと、Atmark Dist 内の include/linux/autoconf.h が Atmark Dist が生成
したと思われる autoconf.h に何故か置き換わってしまいます。※ 何故置き換わって
しまうかは調べていません。

Atmark Dist が生成した autoconf.h には CONFIG_MTD は定義されていませんので、
netflash.c でビルドエラーとなります。