移植Android到具体硬件编译器的制作

来源:互联网 发布:淘宝店激活页面在哪 编辑:程序博客网 时间:2024/06/05 12:43

国内外很多同行朋友在努力porting Android到具体的硬件平台上。既然有那么多的朋友对此感兴趣,在接下来的几个贴子里,我一步步地讲解自己的移植过程。只可惜我们的板子没有GSM通信模块,不过其他已全部移植成功。 
今天先做第一事件--也是所有移植工作的最初几件事之一,就是build一个支持Android的编译器。这就要求build一个至少能支持ARM926EJ-S CPU指令集及EABI规范的GNU Toolchain。也许有好心的朋友会提醒我:网上可以下载已编译好的toolchain。是的,不过,我还是建议你自己手工做一遍!在本人过去几年的开发生涯中,很多时候得益于对编译器的理解。而你自己一步步地手工build整个编译器的经历,有助于你对编译器的理解和掌握,进而在OS Kernel或其他底层开发中给你带来帮助! 

闲话少叙,手工编译GNU Toolchain的步骤如下。我已把详细过程写成一个简单脚本,可从本人blog  
http://AndroidSprite.spaces.live.com   
)下载,所有的步骤已经多人/次测试,直接运行即可生成完整toolchain。 
1. 下载组件包 (版本不必与如下所列完全一致,但gcc应取4.0以上): 
Android Linux Kernel, binutils-2.18 gcc-4.2.3 uClibc-0.9.29 
2. 安装Android kernel及uClibc文件 (其中KERN_PATH指向Android Kernel所在路径,TOOLCHAIN_SYSROOT为toolchain安装路径)  
make -C ${KERN_PATH} 
ARCH=arm 
INSTALL_HDR_PATH=${TOOLCHAIN_SYSROOT}/usr / 
headers_install 5PA*U_Xmr  
#先配置uClibc,然后: z Qna;
make / 
PREFIX=${TOOLCHAIN_SYSROOT} / 8 /
DEVEL_PREFIX=/usr/  
RUNTIME_PREFIX=/ 
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /   
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / }  
HOSTCC=${HOSTCC_PATH} / )fa<(->vp(  
pregen  
make / 
PREFIX=${TOOLCHAIN_SYSROOT} /   
DEVEL_PREFIX=/usr/ / 
RUNTIME_PREFIX=/ / ; 
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include / 
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / 
HOSTCC=${HOSTCC_PATH} / )  
install_headers 
3. 编译binutils(里面包括大家所熟知的gnu as, gnu ld, objdump, etc),TARGET_PLATFORM设为"arm-android-linux-uclibcgnueabi"
cd ${BUILD_PATH}/build_binutils QfpO*
${BINUTILS_PATH}/configure / 
--prefix=/usr   
--build=${BUILD_PLATFORM} / 
--host=${BUILD_PLATFORM} /  
--target=${TARGET_PLATFORM} /  
--with-sysroot=${TOOLCHAIN_SYSROOT}/   
--with-float=soft / 
--disable-multilib /  
--disable-werror Eg
make && make DESTDIR=${TOOLCHAIN_SYSROOT} {Y0]TZ=ZQ*  
4. 第一趟gcc编译,指定TARGET_CPU为"arm926ej-s" 
cd ${BUILD_PATH}/gcc_pass_1 
${GCC_PATH}/configure / 
--prefix=${TOOLCHAIN_SYSROOT}/usr / 
--build=${BUILD_PLATFORM} / 
--host=${BUILD_PLATFORM} / 
--target=${TARGET_PLATFORM} /  
--enable-languages=c / 
--with-sysroot=${TOOLCHAIN_SYSROOT} / 0/B /
--disable-__cxa_atexit / 
--enable-target-optspace /  
--with-gnu-ld / 
--disable-shared / 
--enable-threads / 
--enable-tls / 
--enable-long-long /
--disable-multilib /  
--with-float=soft /   
--with-cpu=${TARGET_CPU} / 
--with-tune=${TARGET_CPU} y Z 
make all-gcc && make install-gcc 
5. 编译uClibc 
cd ${UCLIBC_PATH}
make / 
PREFIX=/ / /
DEVEL_PREFIX=/ / 
RUNTIME_PREFIX=/ / 
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include / 
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / T}

make / 
PREFIX=${TOOLCHAIN_SYSROOT} / 
DEVEL_PREFIX=/usr/ / 
RUNTIME_PREFIX=/ / 
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include / 
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / 
install_runtime install_dev 
6. 第二趟编译gcc 
cd ${BUILD_PATH}/gcc_pass_2 
${GCC_PATH}/configure / 
--prefix=/usr / 
--build=${BUILD_PLATFORM} / 
--host=${BUILD_PLATFORM} /
--target=${TARGET_PLATFORM} / 
--enable-languages=c,c /
--with-sysroot=${TOOLCHAIN_SYSROOT} / 
--with-build-time-tools=${TOOLCHAIN_SYSROOT}/usr/${TARGET_PLATFORM}/bin / 
--disable-__cxa_atexit / 
--enable-target-optspace / 
--with-gnu-ld /  
--enable-shared /   
--enable-threads / 
--with-tls / 
--disable-multilib / 
--enable-long-long / 
--with-float=soft / --with-cpu=${TARGET_CPU} / 
--with-tune=${TARGET_CPU} 
make all W 
make DESTDIR=${TOOLCHAIN_SYSROOT} install yE / 

Done!整个过程在本人的AthlonXP 4000 X2/Core2 Duo T5500 1G DDR667上需要约20分钟时间。 
熟悉LFS的朋友应该不难搞定,只是embedded system一般不需要Native Toolchain,故少了第三趟gcc的编译。