通用makefile是如何炼成的(XI)--最后的完结篇,envsetup.sh

本文介绍了一个简化的envsetup.sh脚本,用于方便地进行模块编译和配置选择,并解释了如何通过命令自动补全简化操作流程。此外,还说明了如何添加产品和编译平台。

长话短说,没有envsetup.sh, 当你需要单独编译一个模块,或者做点其他工作时,你总是会感到为什么命令行总是那么麻烦!有了envsetup.sh, 对命令行人生有新的感悟,原来我也可以做一个简单的“菜鸟”。

这个envsetup.sh是从android的代码中考过来的,做了很大的简化。google他奶奶的太细心和繁琐了,这里用不着

可用通过usage命令查询,

目前仅支持

genmk, 在当前目录下自动生成一个module.mk, 也可以指定名字

mm  单独编译当前目录下的module.mk

mmm 编译指定的module.mk, 可以同时指定多个

choosecombo  指定product,platform, debug/release版本


choosecombo支持命令自动补全,不喜欢google的给出一大串选择题的方式,感觉不合命令行的风格。在不久前的一个blog中还详细谈了如果写一个shell 命令自动补全的脚本,(

linux shell中的命令自动补全(compgen complete)与 命令行参数解析

)反正很简单,当时对cygwin下,命令自动补全有一些略微不同,没详细说,这里再稍微展开说几句。

cygwin的etc 目录下有个bash_completion文件,里面定义两个主要的函数,但我们只要会使用_get_comp_words_by_ref 这个函数就可以了。这个函数会将原来输入的部分命令重新组装成我们需要的样子,比如 原生cygwin状态下,输入 x=t 会被拆解为三个单词 x ,=,  t, 在这个函数中通过-n指定不希望被拆分的符号,在这里就是“=”, 就可以重新组装为x=t。(要查看cygwin遇到哪些字符会将单词拆分,可以echo 变量 COMP_WORDBREAKS)

简单示例_get_comp_words_by_ref -n "=" cur

则cur的结果不是t, 而是x=t


有了这个函数,我们只要将原来引用COMP_CWORD-->cwords,  COMP_WORDS-->words 就可以了。

function __HUB_completion() {
	local cur prev words cword
	_get_comp_words_by_ref -n = cur prev words cword
	case $cword in
	0) ;;
	*) eval __${words[0]}_completion ;;
	esac
}

function __choosecombo_completion()
{
	local cur
	_get_comp_words_by_ref -n = cur
    COMPREPLY=()
	case "${cur}" in
	--buildtype=*)
		local options="debug release"
		COMPREPLY=( $(compgen -W "${options}" -- ${cur#--buildtype=}) )
		;;


最后,说一下如何添加产品和添加编译平台


上面是makefile的部分目录结构,如果需要添加编译平台信息,可以仿照x86-linux.mk, 添加到platforms目录下。编译时通过TARGET_PLATFORM中指定编译平台,也就是引用x86-linux.mk 还是其他的xx.mk.。 在build/config.mk中,可以配置默认的编译平台。


同样,我们的makefile也支持编译多个项目,可以仿照Sameple,Sample2,建立产品信息。你也可以直接将相关文件挂载到products目录,做成匿名的产品。编译时通过TARGET_PRODUCT指定导入哪个产品信息,如果是匿名产品,则令TARGET_PRODUCT="."即可。 同样,在build/config.mk中,可以配置默认的编译产品。

另外,支持在源代码模块中,添加修改上面的产品和平台信息, 分别通过product-specs.mk,platform-specs.mk载入,具体可以查看这两个文件的定义和config.mk。这个一般主要用于添加模块独有的特性,可以做很方便的产品差异控制。其他的也就没什么要特别说的了。


over,年底前总算了有个了结了。





<think>我们正在讨论envsetup.sh文件的作用。根据引用内容,特别是引用[1]和引用[3],envsetup.sh在Android开发环境和Rockchip的SDK中都有出现。它的主要作用是为当前终端会话设置环境变量和添加一些有用的命令(通常称为“lunch”命令等),以便于编译和开发工作。 具体来说,在Android开发中,envsetup.sh脚本会设置一些环境变量,如OUT_DIR(输出目录)等,并定义一些函数,如lunch(用于选择要构建的目标设备)、m(用于构建整个系统)、mm(用于构建当前目录下的模块)等。在Rockchip的SDK中,envsetup.sh同样用于设置编译环境,例如选择目标芯片型号(如rk3399、rk3308等)和配置编译选项。引用[3]中提到了envsetup.sh位于buildroot/build/目录下,并且通过执行`source envsetup.sh`来激活环境,然后可以选择配置(如示例中的选择65)。因此,envsetup.sh的作用可以总结为: 1.设置编译所需的环境变量。2.提供一些辅助函数或命令,方便开发者在终端中执行编译相关的操作。下面我们将详细说明envsetup.sh的功能,并给出一些使用示例。</think>envsetup.sh 脚本在软件开发(尤其是嵌入式系统开发)中扮演着**环境初始化核心角色**,主要功能是为当前终端会话配置编译环境。根据引用内容,其核心作用如下: ### 核心功能 1. **环境变量配置** - 设置工具链路径(如交叉编译器 `aarch64-linux-gnu-gcc`[^4]) - 定义编译输出目录(如 `OUT_DIR`) - 添加 SDK 关键路径到 `PATH` 变量[^3] 2. **构建目标选择** 通过交互式菜单(如 `lunch` 命令)选择目标设备型号: ```bash source envsetup.sh # 激活脚本 lunch # 弹出设备选择菜单 # 示例输出: # 1. rk3399-ubuntu # 2. rk3308-buildroot # 3. ... (输入数字选择配置)[^2][^3] ``` 3. **注册编译命令** 注入快捷命令到当前 Shell- `make` → 触发完整构建流程 - `mkfirmware.sh` → 生成固件镜像[^3] - `rkflash.sh` → 烧写设备[^3] 4. **依赖关系校验** 检查编译工具链完整性(如 `gcc-linaro-6.3.1`[^4]),缺失时提示安装 ### 典型使用场景 ```mermaid graph LR A[打开终端] --> B[source envsetup.sh] B --> C{选择目标设备} C -->|输入编号| D[自动配置环境变量] D --> E[执行编译命令 make] ``` ### 技术实现特点 1. **作用域隔离** 通过 `source` 执行(非独立运行),使配置仅在**当前终端会话**生效,避免污染全局环境[^1][^2] 2. **跨平台支持** 兼容不同芯片架构(如 Rockchip RK3399/RK3308[^3][^4]),通过菜单动态加载配置 3. **模块化扩展** 支持添加自定义函数(如烧写命令 `rkflash.sh`)到 Shell 环境[^3] > **关键提示**:在 Rockchip SDK 中,该脚本是**编译流程的强制前置步骤**,直接执行 `make` 会触发错误: > `Makefile:3: *** “Please use 'source buildroot/build/envsetup.sh'...”[^2]`
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值