很考验耐力的活,基本就是不停的修正编译错误。
1) 用第三方的交叉编译工具编译出静态版本,一般第三方的工具链
会做的比较完备,缺点是出来的东西体积大,而且用不了动态库,比如
dlopen。
我手上有
arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
arm-2009q1-161-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
arm-iwmmxt-linux-gnueabi-4.1.1-gpl.tgz
第一个和第三个有 linux 相关的头文件,第二个貌似只有标准 C 库。
编译办法很简单,改一下 PATH, 然后
./configure --prefix=/system --host=GCC-PREFIX
这里 gcc-prefix 指交叉工具链编译出来的各种命令的前缀,比如
arm-eabi-gcc,那么 --host=arm-eabi
然后就折腾吧,看编译错误,修正 CFLAGS, CPPFLAGS, CXXFLAGS, LDFLAGS,
LIBS, configure.ac, makefile.am 甚至凑合的话直接改 configure, makefile
和源码,不少源码也是没办法考虑到编译环境是残缺的,这时候得改代码了,
量不大,就是琐碎。
我个人比较喜欢的是看 config.log,哪里出错了,然后修改 configure 的
变量,比如 export ac_cv_func_mkfifo=yes,这样做一是因为 configure 的
选项可能没那么细致的控制,而是如果 mkfifo 是在头文件里定义的 inline
函数(比如用 mknod 实现),那么 autoconf 探测会失败,因为它是弄了个
空原型,编译后测试链接是否通过,这时当然找不到 mkfifo 了。
做法比较龌龊,我也没那闲心做细致完美了,sigh
===========================================================
%2Fgroups%2Fcomp.faq%2FMobileDev%2Fandroid%2FM.1250830922.N0
2) 用第三方交叉编译工具 configure 出来,记录编译的命令行,
记录 ar 包里包含哪些 object,对应哪些文件,通过这些信息
构造 Android.mk,然后用 Android 的工具链编译,修正编译错误。
这里很大问题是 configure 不是在 android 工具链里作的,所以
可能找到 android 工具链没有提供的特性,需要编译时不断修正,
回去重新 configure,再作 Android.mk。
当然你也可以在 android 工具链里 configure,总之少不了琐碎
活,整理出 Android.mk。
这个的好处是跟 Android 的构建系统融合很好,基本一次搞定后
后续维护很方便,Android 自带的库看样子有不少是这么搞的,
我也曾经这么移植过 swfdec 依赖的十几个库。
这个办法麻烦的是太繁琐了。
此过程的一些技巧:
(1) 用 git 管理代码,git clean 和 reset 可以在重新编译时很快的恢复到
原始代码,省却删除代码树重新解压的麻烦;
(2) 如果需要设置环境变量,先执行 bash 进入一个新 shell,此时 echo $SHLVL
会显示现在是在第几个 shell 里,编译完成后 exit 回到先前的 shell,这样不用
注销就能回到干净的编译环境下。
可以在 .bashrc 里设置 PS1='[$SHLVL]$(__git_ps1 "(%s)")'"$PS1" 以在
shell 提示符里显示 SHLVL 和当前所在 git 分支。
(3) 在 screen 里操作,方便新建多个窗口操作,而且能在注销后继续运行任
务并在下次登录时回复到先前操作状态。
=================================================================
%2Fgroups%2Fcomp.faq%2FMobileDev%2Fandroid%2FM.1250831302.N0
3) 找出 Android 编译环境的编译参数,然后在此环境下 configure,
make 得到编译结果,不管 Android 那套构建系统,缺点当然是集成
的不好,优点是很省事。需要注意的是不同产品、以及 debug、release
模式出来的结果貌似不同用,比如同一产品的 debug 版本 bash 不能
用在 release 版本的产品里,运行时会报告链接失败,符号找不到。
比如我折腾出来的编译 bash-4.0 的 Android.makefile:
TARGET_TOOLS_PREFIX ?= arm-eabi-
CC := $(TARGET_TOOLS_PREFIX)gcc
CXX := $(TARGET_TOOLS_PREFIX)g++
AR := $(TARGET_TOOLS_PREFIX)ar
LD := $(TARGET_TOOLS_PREFIX)gcc
INC := -I$(ANDROID_BUILD_TOP)/bionic/libc/arch-arm/include \
-I$(ANDROID_BUILD_TOP)/bionic/libc/include \
-I$(ANDROID_BUILD_TOP)/bionic/libstdc++/include \
-I$(ANDROID_BUILD_TOP)/bionic/libc/kernel/common \
-I$(ANDROID_BUILD_TOP)/bionic/libc/kernel/arch-arm \
-I$(ANDROID_BUILD_TOP)/bionic/libm/include \
-I$(ANDROID_BUILD_TOP)/bionic/libm/include/arch/arm \
-I$(ANDROID_BUILD_TOP)/bionic/libthread_db/include
CPPFLAGS := $(INC) -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__ \
-DANDROID -DNDEBUG -UDEBUG \
#-include $(ANDROID_BUILD_TOP)/system/core/include/arch/linux-arm/AndroidConfig.h
CFLAGS := -fno-exceptions -Wno-multichar -msoft-float -fpic \
-ffunction-sections -funwind-tables -fstack-protector \
-fno-short-enums -march=armv5te -mtune=xscale \
-mthumb-interwork -fmessage-length=0 \
-W -Wall -Wno-unused -Werror=return-type -Wstrict-aliasing=2 \
-finline-functions -fno-inline-functions-called-once \
-fgcse-after-reload -frerun-cse-after-loop -frename-registers \
-mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 \
-g -O2
CXXFLAGS := -fno-exceptions -fno-rtti
LDFLAGS := -nostdlib -Bdynamic \
-Wl,-T,$(ANDROID_BUILD_TOP)/build/core/armelf.x \
-Wl,-dynamic-linker,/system/bin/linker \
-Wl,--gc-sections \
-Wl,-z,nocopyreloc \
-L$(ANDROID_PRODUCT_OUT)/obj/lib \
-Wl,-rpath-link=$(ANDROID_PRODUCT_OUT)/obj/lib \
$(ANDROID_PRODUCT_OUT)/obj/lib/crtbegin_dynamic.o
# should be at the end of commend line to link objects
POSTLINK := $(ANDROID_PRODUCT_OUT)/obj/lib/crtend_android.o
LIBGCC := $(ANDROID_TOOLCHAIN)/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a
LIBS := -lc -lm $(LIBGCC) $(POSTLINK)
export CC CXX AR LD
export CPPFLAGS CFLAGS CXXFLAGS LDFLAGS
export LIBS
export ac_cv_func_mkfifo=yes
export ac_cv_func_tcgetattr=yes
export ac_cv_func_getpagesize=yes
export ac_cv_header_grp_h=no
export bash_cv_job_control_missing=no
all:
$(ANDROID_BUILD_TOP)/external/bash/configure --prefix=/system --host=arm-eabi --disable-multibyte
make
[ -f bash ] && mv bash bash.orig && soslim -s -S -Q -o bash bash.orig
阅读(2488) | 评论(0) | 转发(0) |