Tizen 移植(porting) 入門 〜EFL -evas- 編〜 part 1 - N9/Tizenったりの続き。
問題検証
checking for GLES2/gl2.h... no checking for glTexImage2D in -lGLESv2... no
- glTexImage2Dが何故か見つからないと言われる。
- gl2.hには定義されているし、無いはずがない。
configureのログは文字通り config.log に保存されます。それを確認してみると下記の部分でエラーになっているのが判りました。
configure:24698: checking for XShmCreateImage in -lXext configure:24723: gcc -std=gnu99 -o conftest -g -O2 conftest.c -lXext >&5 /usr/bin/ld: cannot find -lXext collect2: ld returned 1 exit status configure:24723: $? = 1
どうも、libXext.soがないと怒っているようです。findで確認してます。
# find /usr/lib |grep libXext /usr/lib/libXext.so.6.4.0 /usr/lib/libXext.so.6
間違いなくあります。。。が、/usr/lib/libXext.soがありません。恐らくココはこれが原因なので、シンボリックリンクを貼って再度試してみます。
# ln -s /usr/lib/libXext.so.6 /usr/lib/libXext.so
configure:24698: checking for XShmCreateImage in -lXext configure:24723: gcc -std=gnu99 -o conftest -g -O2 conftest.c -lXext >&5 configure:24723: $? = 0 configure:24732: result: yes
無事libXext.soを見つけられるようになりました。冒頭のglTexImage2Dが見つからなかった件も、上記が原因で出ていたようです。無事に通過しました。
configure:27254: checking for glTexImage2D in -lGLESv2 configure:27279: gcc -std=gnu99 -o conftest -g -O2 conftest.c -lGLESv2 -lEGL -L/usr/X11R6/lib -lX11 -lXext -lX11 -lXext -lXrender -lm -pthread >&5 configure:27279: $? = 0 configure:27288: result: yes
これで、ハードウェアレンダリングのオプションを有効化したMakefileが無事生成されました。
Engines: Software Memory Buffer.....: yes Software X11...............: yes (Xlib: yes) (XCB: no) OpenGL X11.................: yes (Xlib: yes) (XCB: no) (GLES: yes) (SGX: yes) (s3c6410: no) Software GDI...............: no Software DirectDraw........: no Direct3d...................: no OpenGL SDL.................: no
再度ビルドしてみる
Makefileが出来たので、実際にmakeしてみます。すると、blendと思しき処理部分でコンパイルエラーが出ています。*1
CC evas_op_blend_main_.lo /tmp/ccJ6f61x.s: Assembler messages: /tmp/ccJ6f61x.s:9655: Error: selected processor does not support ARM mode `pld [r0,#64]' /tmp/ccJ6f61x.s:9790: Error: selected processor does not support ARM mode `pld [ip]' /tmp/ccJ6f61x.s:9800: Error: selected processor does not support ARM mode `pld [ip]' make[6]: *** [evas_op_blend_main_.lo] Error 1
字面を鵜呑みにすると、
”ARMのassemblerでpldを使っているけど、お前の指定したプロセッサじゃARM modeでの処理をサポートしてねーよ”
だと思うのですが。。。そもそも-marchの指定が怪しい気がします。config.logには
uname -m = armv7l
とあるので、多分正しいはずです。なんですが、READMEをみるとCFLAGにexportしろと言ってるみたいです。(defaultだとarmv5になりそう)
# export CFLAGS="-march=armv7 -mcpu=cortex-a9 -mfpu=vfp -mfloat-abi=softfp"
こんな感じで定義して、再度configureを実行します。*2すると、エラーが変わりました。
evas_convert_rgb_32.c: In function ‘evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90’: evas_convert_rgb_32.c:268:9: error: can't find a register in class ‘GENERAL_REGS’ while reloading ‘asm’ evas_convert_rgb_32.c:268:9: error: ‘asm’ operand has impossible constraints make[6]: *** [evas_convert_rgb_32.lo] Error 1
これはsbsでビルドした際にも同じ箇所がエラーになっていたので、取り敢えずCPU処理になるようにプログラムをいじります。ファイルはevasをgit cloneしたディレクトリの
./src/lib/engines/common/evas_convert_rgb_32.c
にあります。該当箇所は下記のようになっています。
else { # define AP "convert_rgba32_rot_90_" asm volatile ( ".fpu neon \n\t"
32bitカラーのRGBAデータをTileローテーションするのにNEONを使ってるみたいです。本当はきちんと直すべきですが、メンドイのでCPUレンダリングの部分を上の方のifndef部分から取ってきて、下記のような感じにゴリっと追加します。*3
#if 1 /* moguriso */ DATA32 *src_ptr; DATA32 *dst_ptr; int x, y; dst_ptr = (DATA32 *)dst; CONVERT_LOOP_START_ROT_90(); *dst_ptr = *src_ptr; CONVERT_LOOP_END_ROT_90(); #else /* moguriso */ # define AP "convert_rgba32_rot_90_" asm volatile ( 〜(略)〜 #endif /* moguriso */
ビルドは通るようになりましたが、別のところで見覚えのないエラーが出ました。。。
In file included from evas_engine.c:5:0: evas_engine.h:11:35: fatal error: X11/extensions/XShm.h: そのようなファイルやディレクトリはありません compilation terminated.
XShm.hをホストから、apt-fileでsearchしてみます。
$ apt-file search XShm.h libxext-dev: /usr/include/X11/extensions/XShm.h
どうも、先程つまづいたlibXextのdevelにいるようです。取り敢えず、下記からdevelを落としてきます。
https://download.tizen.org/snapshots/1.0/tizen-1.0_20120613.10/repos/main/armv7l/packages/armv7l/
普通にrpmなので、rootでrpm -iするだけのはずですが、アーキテクチャが違うと怒られます。
# rpm -ivh --nodeps --force /home/abuild/libxext-devel-1.2.0-2.3.armv7l.rpm 準備しています... ########################################### [100%] パッケージ libxext-devel-1.2.0-2.3.armv7l は different アーキテクチャ向けです
"--ignorearch"すれば一応は入れようとしますが、今度はVersion不一致で怒られます。
# rpm -ivh --force --ignorearch /home/abuild/libxext-devel-1.2.0-2.3.armv7l.rpm エラー: 依存性の欠如: libxext = 1.2.0-2.3 は libxext-devel-1.2.0-2.3.armv7l に必要とされています pkgconfig(xextproto) は libxext-devel-1.2.0-2.3.armv7l に必要とされています
確認したところ、1.2.0-2.4というVersionを使っているようです。
(tizen-build-env)@crowne evas]# rpm -qa|grep -i xext libxext-1.2.0-2.4.armv7l
2.0aのリポジトリを探しましたが、1.3.0に更新されています。
1.2.0-2.4って何者?
取り敢えず、マイナーバージョンの差なので2.3を無理やりインストールします。
# rpm -ivh --force --ignorearch --nodeps /home/abuild/libxext-devel-1.2.0-2.3.armv7l.rpm 準備しています... ########################################### [100%] 1:libxext-devel ########################################### [100%]
先程スルーしましたが、pkgconfig(xextproto)も怒られていました。ついでにDLして入れておきます。
# rpm -ivh --force --ignorearch --nodeps /home/abuild/xorg-x11-proto-xextproto-7.1.2-1.2.armv7l.rpm 準備しています... ########################################### [100%] 1:xorg-x11-proto-xextprot########################################### [100%]
これでmakeすると、ビルドが通りました。rootでmake installするとrootfsにinstallもできるハズです。
最終的に利用したconfigureオプションは下記のような感じになっています。(諸事情でprefixしていしてinstall先を変えています)
./configure --disable-static \ --disable-image-loader-svg \ --enable-simple-x11 \ --with-x \ --enable-fb \ --enable-xrender-x11 \ --enable-line-dither-mask \ --disable-image-loader-edb \ --disable-rpath \ --enable-gl-x11 \ --enable-gl-flavor-gles \ --enable-gles-variety-sgx \ --enable-pthreads \ --enable-cpu-neon \ --enable-winkcodec=yes \ --enable-gl-xlib \ --prefix=/home/abuild/local
。。。続く。。。