赞
踩
一、android_rust 简介
项目地址https://android.googlesource.com/toolchain/android_rust
android_rust是一个为安卓环境编译rust的项目,这个项目本身使用python写成,通过执行build.py,使用自带的工具去完成rust的编译,最终还是调用了rust本身的x.py。在我们为RISC-V架构的安卓移植rust前,我们首先对这个项目进行分析。
二、项目文件分析
首先查看该项目的结构
1. build.py
build.py是该项目的入口,有一个函数get_host_tag()。该函数将获得host的系统平台,使用sys.platform.startwitch()检测系统版本。如果sys.platform以linux开头,则默认host为linux-x86。否则如果以darwin开头,则默认host为darwin-x86。如果都不是,则抛出错误’Unsupported host’。将python_bin赋值为对应平台的python路径,创建一个新的子进程,用其中包含的python执行do_build.py.
2. do_build.py
STDLIB_SOURCES定义了需要的标准库
LLVM_BUILD_PATHS_OF_INTEREST
parse_args() 如注释所示,这个函数用来解析输入的参数
main() 函数的主程序
首先创建三个文件夹: OUT_PATH, OUT_PATH_PACKAGE和OUT_PATH_WRAPPERS
这三个常量的定义在paths.py
实际上,
OUT_PATH 在工作目录下创建一个新的文件夹out
OUT_PATH_PACKAGE 在out文件夹里创建一个新的文件夹package
OUT_PATH_WRAPPERS在out文件夹里创建一个新的文件夹wrappers
dist_dir = os.environ.get(‘DIST_DIR’) 获取系统中的$DIST_DIR环境变量
如果$DIST_DIR存在,则解析这个目录,否则在工作目录创建一个dist文件夹
执行source_manger.setup_files函数
此函数位于source_manager.py中,函数setup_files仅在此处被调用
函数 setup_files的声明部分如下
有四个参数,input_dir, output_dir和patches_dir为Path类型,no_patch_abort默认为False。根据注释,此函数用来应用补丁文件,如果补丁应用成功,则重命名输出目录。
清理无用的临时目录
如果目录存在,则清理该目录
如果目录不存在,则建立目录
根据系统类型调用不同的命令,创建一份rust源码的拷贝
调用函数apple_patches给源码打补丁
应用补丁的过程如下,在此不过多叙述
回到do_build.py
设置rust环境
子线程调用x.py –help,用来生成cargo config
调用cargo去获取离线包,重新生成lockfile
执行编译动作,如果遇到错误,报错并退出
如果在linux环境下,移除已存在的OUT_PATH_STDLIB_SRCS并重新拷贝
对二进制文件进行strip操作,这个操作可以为库文件瘦身,减小占用的容量
安装libc++库到out/package/lib64/
过滤Android.mk和Android.bp文件
3. config.py
在do_build.py中调用了config.configure(args, env),这个函数存在于config.py中,因此在这里单独解析
首先是函数声明部分,然后设置编译器/连接器的参数
如果在darwin平台下,寻找系统目录
把linker的设置连接起来
处理$,设置device_linker_flags
更新环境变量
在linux系统中,调整目录
设置一些其他路径和arguments
设置环境和其他目录
此处的host_configs()
实际上生成了host的cc,cxx,linker的wrapper
device_config()
实际上生成了device的cc,cxx和linker的wrapper
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。