Android blueprint/microfactory/microfactory.bash源码分析

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
}
编译安卓代码有如下报错怎么解决FAILED: out/soong/build.ninja cd "$(dirname "out/host/linux-x86/bin/soong_build")" && BUILDER="$PWD/$(basename "out/host/linux-x86/bin/soong_build")" && cd / && env -i "$BUILDER" --top "$TOP" --soong_out "out/soong" --out "out" -o out/soong/build.ninja --globListDir build --globFile out/soong/globs-build.ninja -t -l out/.module_paths/Android.bp.list --available_env out/soong/soong.environment.available --used_env out/soong/soong.environment.used.build Android.bp InitTmsEnv: err1 = open vendor/tms/proprietary/conf/nfc/hw/tms_env.sh: no such file or directory InitTmsEnv: path1 = vendor/tms/proprietary/conf/nfc/hw/tms_env.sh GetCrootPath: path = /home/joey/my_work/sprd/C9000U/out/host/linux-x86/bin/../../../.. sven version name : 13 sven version number: 13 binSeGetProps: USE_C1= binSeGetProps: USE_TMS_NFC= true lib7816GetProps: USE_C1= lib7816GetProps: USE_TMS_NFC= true libTmsDlCommonGetProps: USE_C1= libTmsDlCommonGetProps: USE_TMS_NFC= true camera device DEBUG_MALLOC Off libTmsDlReeGetProps: USE_C1= libTmsDlReeGetProps: USE_TMS_NFC= true libTmsDlTeeGetProps: USE_C1= libTmsDlTeeGetProps: USE_TMS_NFC= true DEBUG_MALLOC_OFF Killed 07:23:12 soong bootstrap failed with: exit status 1 ninja: build stopped: subcommand failed. #### failed to build some targets (19:09 (mm:ss)) #### ===============BUILD TIME ANALYSIS=============== [total build time 0:34:21 (hh:mm:ss)] bsp build time: 0:15:12(44.25%) android build time: 0:19:09(55.75%) [android build]regen: 0:19:09(100.00%) [android build]real build: 0:00:00(0.00%) [android build time details] startup: 99.50ms(0.00%) find modules: 371.32ms(0.02%) [total]path: 430.37ms(0.02%) [total]dumpvars: 9,391.34ms(0.46%) [total][soong]blueprint bootstrap: 4,858.69ms(0.24%) [total][soong]environment check: 0.02ms(0.00%) [total][soong]bpglob: 313.70ms(0.02%) [total][soong]bootstrap: 1,133,323.78ms(54.99%) [total]soong: 1,138,498.31ms(55.24%) [total]dist: 0.56ms(0.00%) total: 1,148,322.27ms(55.72%) upload_metrics: 0.05ms(0.00%) [build command] build/soong/soong_ui.bash --make-mode -j64 ===============BUILD TIME ANALYSIS===============
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值