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

ops/2024/10/22 9:51:28/

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=0fifi#声明了一个局部变量 mf_cmd,用于存储 microfactory 命令local mf_cmd#如果 from_src 为 1,表示需要从源代码构建 microfactoryif [ $from_src -eq 1 ]; then# `go run` requires a single main package, so create one#创建一个中间目录,用于存放生成的源代码,因为go run需要go文件的package为mainlocal 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.gomf_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
}

http://www.ppmy.cn/ops/124178.html

相关文章

游离的 HEAD 如何解决

简介 问题描述:使用 IDEA 在提交代码时,禁止提交 如何解决:迁出分支再提交,最后合并到 main 或 master 上 如何解决

vulnhub-Web Developer 1靶机

vulnhub:Web Developer: 1 ~ VulnHub 导入靶机,放在kali同网段,扫描 靶机在192.168.114.129,扫描端口 有网站服务,访问 没什么东西,扫目录 真不少,访问一下,也只是一些普通的Wordpr…

【RabbitMQ高级——过期时间TTL+死信队列】

1. 过期时间TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。 目前有两种方法可以设置。 第一种方法是通过队列属性设置,队列中所有消…

EdgeNAT: 高效边缘检测的 Transformer

EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b):来自BSDS500的数据集的输入图像。(c, d):对应的真实标签。(e, f):由EdgeNAT检测到的边缘。(e)显示了由于颜色变化…

Stable Diffusion绘画 | 如何做到不同动作表情,人物角色保持一致性(上篇)

由于 SD 具有强大的可控性,在固定人物角色方面,SD 是远超 MJ 的, 其中最好用,也是最优先的方法就是训练一个自己专属的角色模型,例如之前使用秋叶训练器得到的 LoRA模型。 另外,如果不想自己训练模型的话…

重学SpringBoot3-集成Redis(三)之注解缓存策略设置

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(三)之注解缓存策略设置 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码:自定…

PostgreSQL学习笔记九:事务详解

在PostgreSQL中,事务(TRANSACTION)是一个重要的概念,旨在确保数据库操作的完整性和一致性。事务是一个逻辑单位,包含一系列数据库操作,这些操作要么全部成功,要么全部失败。事务的主要特性可以用…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL76

任意奇数倍时钟分频 描述 编写一个模块,对输入的时钟信号clk_in,实现任意奇数分频,要求分频之后的时钟信号占空比为50%。模块应包含一个参数,用于指定分频的倍数。 模块的接口信号图如下: 要求:使用Veril…