两年前因为要移植一些linux功能库曾经用过cegcc0.51(自己下载代码重新编译的),之后就没有用过。这两天闲来无事想把pixman移植到wince就上到SF上发现已经更新到0.59.1了,一时兴起就又下了代码编译,现在把出现的问题记录下来就当是温故知新吧。需要说明的是现在SF上有三个交叉编译环境,cygwin是在windows下用的,cegcc和mingw32ce则是在linux下用的。考虑到pixman是在linux下用的,因此下载cegcc来进行编译
准备工作:我是用的vmware 7.1+ubuntu 11.10,考虑到ubuntu 11.10的gcc版本是4.6而cegcc是4.4.0,所以将ubuntu的gcc降到4.4.5避免出现一些莫名其妙的问题,另外需要安装texinfo、flex、bison、gawk(mawk会出一些问题)这些基本的库,新建一个目录cegcc用于存放SVN上下载到本地代码后就可以动手进行工作了。
cegcc本身是提供一个编译脚本build-cegcc.sh的,不过它只能对单一的模块进行编译,因此可以先建一个目录cegcc-builds(我是建在和源码目录同一级的)用于存放编译中间文件,然后在此目录中另建一个脚本文件用于批量编译,内容如下
../cegcc/src/scripts/build-cegcc.sh --prefix=$CEGCC_PATH --components="binutils bootstrap_gcc w32api newlib dummy_cegccdll gcc cegccdll cegccthrddll libstdcppdll profile"
按照之前编译0.51的经验,考虑到在编译某一模块的时候会出错,可以将components参数只指定一个,这样就可以一个接一个的通过,避免每次出错都要全部编译(注:如果出现错误,也不一定需要重新执行,它会重新进行配置,只要进入相应目录修改后make就可以了)。
编译binutils很顺利,但是编译到bootstrap_gcc时发现gcc4.4.0需要有gmp、mpfr的支持,按照网上的说法只要将这两个库的源代码放到gcc的根目录下就可以了,因此下载了gmp4.3.1和mpfr3.1.1放到gcc-4.4.0目录,再编译提示找不到mpfr.h,原来3.1.1目录结构进行了调整将源文件放到了src目录而不是它的根目录,重新下载3.1.0编译提示找不到gmp-impl.h和longlong.h,这两个文件是gmp中的,配置文件指向的是cegcc-builds下的gmp,这两个文件并没有拷贝过来,在build-cegcc.sh中的build_bootstrap_gcc函数中第一个make前加入一行路径设置,修改如下
。。。
CPPFLAGS="-I${BASE_DIRECTORY}/${gcc_src}/gmp" \
make ${PARALLELISM} all-gcc
。。。
如果加的是--with-gmp-include=${BASE_DIRECTORY}/${gcc_src}/gmp则在编译到mpfr的时候会报错"Do not use --with-gmp-build and other --with-gmp options simultaneously",因为mpfr中用到了--with-gmp-build,这个选项估计是系统已经安装了gmp和mpfr库不需要单独编译源代码时用(注:后来发现在cygwin下如果安装了mpfr和gmp组件也不需要再单独下载源代码做上述修改了)
w32api、newlib、dummy_cegccdll无问题,gcc和bootstrap_gcc是一样的问题,解决办法也一样
经过这些修改就能编译出需要的toolchain了,现在就是开始pixman的编译了。
我用的的pixman-0.24,配置脚本如下
PATH=/opt/cegcc/bin:$PATH \
./configure --host=arm-cegcc --prefix=/usr/wince --enable-static --disable-shared
要注意的是必须要静态编译,否则会报什么__imp___nedf2重定义的错误,就算是静态编译也会有一些警告出现,我想这可能与cegcc有关,没有再做深入研究了。另外出现的一个错误就是未安装libtool,这个见招拆招就行了。编译完后make install就在/usr/wince下生成了相应的库和头文件,test下的测试程序也生成了,demos下的程序因为与gtk+有关,所以没有编译,要想编译估计要生成gtk+才行。
最后一个问题:如何把simd和neno功能也加进来呢?
用cygwin+mingw32ce进行编译可以生成支持neon的库,不过要做一些修改:
1、修改configure,使能够支持NEON
将#ifndef __ARM_EABI__的宏定义段用#ifndef _WIN32_WCE包含,eabi是用于elf target的
2、将.eabi_attribute伪指令前面加@,原因同上一点。汇编文件中有这个的伪指令的先相应修改
3、配置参数
LDFLAGS="-L/usr/wince/lib" CFLAGS="-I/usr/wince/include -D_WIN32_WCE" PNG_CFLAGS="/usr/wince/include/libpng15" PNG_LIBS="-L/usr/wince/lib -lpng" PKG_CONFIG_PATH="/usr/wince/lib/pkgconfig" CC=arm-mingw32ce-gcc AR=arm-mingw32ce-ar LD=arm-mingw32ce-ld ./configure --prefix=/usr/wince --host=arm-mingw32ce
/usr/wince是所有移植库存放位置,pixman可以用png做为backend