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 でビルドエラーとなります。