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

发布于:2024-10-12 ⋅ 阅读:(13) ⋅ 点赞:(0)

该文件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方法。