android_rust分析

一、android_rust 简介

项目地址https://android.googlesource.com/toolchain/android_rust

android_rust是一个为安卓环境编译rust的项目,这个项目本身使用python写成,通过执行build.py,使用自带的工具去完成rust的编译,最终还是调用了rust本身的x.py。在我们为RISC-V架构的安卓移植rust前,我们首先对这个项目进行分析。

二、项目文件分析

首先查看该项目的结构 

  • patches存放了最新的补丁
  • templates 存放了需要的工具的wrapper

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值