読者です 読者をやめる 読者になる 読者になる

Tizen 移植(porting) 入門 〜EFL -evas- 編〜 part 2

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

。。。続く。。。

*1:sbsではこんなに苦労しなかった気がする...

*2:-mcpu=cortex-a9はいらなかったかも

*3:Neon無効にしたほうが良いのかもです・・・