build_go负责编译相关源码为二进制文件,而build_go内部使用的是microfactory工具,可以按其字面意思理解为是微工厂:生产二进制文件。
# 用于构建和运行使用 microfactory 工具的 Go 代码
# Set of utility functions to build and run go code with microfactory
#
# Inputs:
# ${GOROOT}
# ${BUILDDIR}
# ${BLUEPRINTDIR}
# ${SRCDIR}
# Bootstrap microfactory from source if necessary and use it to build the
# requested binary.
#
# Arguments:
# $1: name of the requested binary ---> soong_ui
# $2: package name ---> android/soong/cmd/soong_ui
# ${EXTRA_ARGS}: extra arguments to pass to microfactory (-pkg-path, etc)
function build_go
{
# Increment when microfactory changes enough that it cannot rebuild itself.
# For example, if we use a new command line argument that doesn't work on older versions.
# 声明了一个局部变量 mf_version,用于跟踪 microfactory 的版本。如果 microfactory 发生变化,这个版本号需要递增
local mf_version=3
# 声明了一系列局部变量,用于存储 microfactory 源代码路径、可执行文件路径、版本文件路径、构建的二进制文件路径和是否从源代码构建的标志
local mf_src="${BLUEPRINTDIR}/microfactory"
local mf_bin="${BUILDDIR}/microfactory_$(uname)"
local mf_version_file="${BUILDDIR}/.microfactory_$(uname)_version"
local built_bin="${BUILDDIR}/$1"
local from_src=1
# 检查 microfactory 可执行文件和版本文件是否存在
if [ -f "${mf_bin}" ] && [ -f "${mf_version_file}" ]; then
# 如果当前的 mf_version 与版本文件中的版本号相同,说明 microfactory 已经是最新的,不需要重新构建
if [ "${mf_version}" -eq "$(cat "${mf_version_file}")" ]; then
# 如果 microfactory 已经是最新的,将 from_src 设置为 0,表示不需要从源代码构建
from_src=0
fi
fi
#声明了一个局部变量 mf_cmd,用于存储 microfactory 命令
local mf_cmd
#如果 from_src 为 1,表示需要从源代码构建 microfactory
if [ $from_src -eq 1 ]; then
# `go run` requires a single main package, so create one
#创建一个中间目录,用于存放生成的源代码,因为go run需要go文件的package为main
local gen_src_dir="${BUILDDIR}/.microfactory_$(uname)_intermediates/src"
mkdir -p "${gen_src_dir}
#使用 sed 命令将 microfactory.go 文件中的 package microfactory 替换为 package main,并将结果写入中间目录
sed "s/^package microfactory/package main/" "${mf_src}/microfactory.go" >"${gen_src_dir}/microfactory.go"
#构建 mf_cmd 命令,使用 go run 来运行生成的 microfactory.go
mf_cmd="${GOROOT}/bin/go run ${gen_src_dir}/microfactory.go"
else
#如果不需要从源代码构建,直接使用已构建的 microfactory 可执行文件
mf_cmd="${mf_bin}"
fi
#删除构建过程中产生的跟踪文件
rm -f "${BUILDDIR}/.$1.trace"
# GOROOT must be absolute because `go run` changes the local directory
# 确保 GOROOT 是绝对路径;执行 microfactory 命令,构建指定的二进制文件
GOROOT=$(cd $GOROOT; pwd) ${mf_cmd} -b "${mf_bin}" \
-pkg-path "github.com/google/blueprint=${BLUEPRINTDIR}" \
-trimpath "${SRCDIR}" \
${EXTRA_ARGS} \
-o "${built_bin}" $2
#如果构建成功并且是从源代码构建的,更新版本文件
if [ $? -eq 0 ] && [ $from_src -eq 1 ]; then
# 将当前的 mf_version 写入版本文件
echo "${mf_version}" >"${mf_version_file}"
fi
}