Android build/soong/scripts/microfactory.bash源码分析

该文件export一个全局变量,提供了两个方法,执行了一个source导入命令。

export一个全局变量

复制代码
# Ensure GOROOT is set to the in-tree version.
# 确保 GOROOT 环境变量被设置为 Android 源代码树中的适当版本的 Go 运行时目录
# uname返回操作系统的名称
# 开始一个 case 语句,用于根据操作系统执行不同的命令。
case $(uname) in
    Linux)
        export GOROOT="${TOP}/prebuilts/go/linux-x86/"
        ;;
    Darwin)
        export GOROOT="${TOP}/prebuilts/go/darwin-x86/"
        ;;
    *) echo "unknown OS:" $(uname) >&2 && exit 1;;
# 结束一个case语句
esac

export 全局变量 GOROOT,作为Android源代码go语言运行时目录,即go源码的位置。

提供两个方法

1. getoutdir

getoutdir 确定 Android 构建系统的输出目录

复制代码
function getoutdir
{
    #尝试使用环境变量 OUT_DIR 的值对其进行初始化。如果 OUT_DIR 未设置,out_dir 将为空字符串
    local out_dir="${OUT_DIR-}"
    #-z 测试操作符用于检查字符串长度是否为零
    if [ -z "${out_dir}" ]; then
        #再次检查环境变量 OUT_DIR_COMMON_BASE 是否设置。如果设置了,使用它的值来构建输出目录的路径
        if [ "${OUT_DIR_COMMON_BASE-}" ]; then
            #如果 OUT_DIR_COMMON_BASE 被设置了,将 out_dir 设置为 OUT_DIR_COMMON_BASE 目录下,
            #加上 TOP 变量所指向的目录的基本名称(即 TOP 目录的名称)
            out_dir="${OUT_DIR_COMMON_BASE}/$(basename ${TOP})"
        else
            #如果没有指定 OUT_DIR 或 OUT_DIR_COMMON_BASE,则默认输出目录为 out
            out_dir="out"
        fi
    fi
    #如果 out_dir 不是绝对路径,将其设置为相对于 TOP 目录的路径
    if [[ "${out_dir}" != /* ]]; then
        out_dir="${TOP}/${out_dir}"
    fi
    #输出最终确定的输出目录路径
    echo "${out_dir}"
}

2. soong_build_go

用于将源码编译为二进制文件,有两个参数,第一个参数指定二进制文件的名称,第二个参数执行二进制文件编译所需的源码位置。

复制代码
# Bootstrap microfactory from source if necessary and use it to build the
# requested binary.
#
# Arguments:
#  $1: name of the requested binary
#  $2: package name
#它用于构建指定的 Go 语言编写的 Android 二进制文件。
#这个函数使用了 microfactory 工具来构建 Go 代码
function soong_build_go
{
    #调用 getoutdir 函数来确定构建输出目录
    BUILDDIR=$(getoutdir) \
      #Android 源代码树的顶部目录
      SRCDIR=${TOP} \
      #存放构建蓝图文件的目录
      BLUEPRINTDIR=${TOP}/build/blueprint \
      #构建额外参数 EXTRA_ARGS,用于指定 Go 包的路径。这里指定了两个包路径:android/soong 和
      #github.com/golang/protobuf,它们都指向 TOP 目录下的特定子目录
      EXTRA_ARGS="-pkg-path android/soong=${TOP}/build/soong -pkg-path github.com/golang/protobuf=${TOP}/external/golang-protobuf" \
      #调用 build_go 函数,并传递所有传入 soong_build_go 函数的参数($@ 表示所有参数)
      build_go $@
}

执行了一个source导入命令

复制代码
# 执行命令或导入函数变量
source ${TOP}/build/blueprint/microfactory/microfactory.bash

负责提供soong_build_go所需的build_go方法。

相关推荐
Frank_HarmonyOS1 小时前
Android MVVM(Model-View-ViewModel)架构
android·架构
时间裂缝里的猫-O-1 小时前
@Linux问题 :bash fork Cannot allocate memory 错误分析与解决方案
linux·chrome·bash
文火冰糖的硅基工坊2 小时前
[激光原理与应用-317]:光学设计 - Solidworks - 草图
开发语言·python·信息可视化·系统架构
草莓熊Lotso2 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day10
c语言·开发语言·经验分享·算法·强化
草明2 小时前
docker stats 增加一列容器名称的显示
java·开发语言·docker
He1955012 小时前
Go初级二
开发语言·后端·golang
草莓熊Lotso3 小时前
【C++】--函数参数传递:传值与传引用的深度解析
c语言·开发语言·c++·其他·算法
Ice__Cai3 小时前
Flask 路由详解:构建灵活的 URL 映射系统
开发语言·python·flask
l1t4 小时前
分析xml标签属性和压缩级别对xlsx文件读取解析的影响
xml·开发语言·python·sql·duckdb
Jenkinscao4 小时前
我从零开始学习C语言(13)- 循环语句 PART2
c语言·开发语言·学习