简化编译命令

无论是在Android编译系统中,还是在Yocto编译系统中,要编译一个目标,输入命令都有点费事。

Yocto系统:

source setup-environment $FOLDER
bitbake $TARGET

Android系统:

source build/envsetup.sh
launch $MENU
make -j$N

通常的做法是编写一个build脚本来解析输入的命令。用户只需要输入一行命令来编译目标。

build <board> <target> [arg]

比如,要为名为board-a的项目编译kernel, 则只需要输入一行: build board-a kernel。

在Yocto系统中还可以加入额外的参数 build board-a kernel -f -c compile。(-f -c compile将进行强制编译)

build脚本很大程度上简化了编译命令的输入。

build脚本的实现

build脚本的实现也比较简单。下面以Android编译系统为例。

1. 准备一个target.conf文件,放置变化的参数表格。

#board      u-boot-defconfig    kernel-deconfig    launch-menu
board-a a-defconfig a-defconfig launch-menu-a
board-b b-defconfig b-defconfig launch-menu-b

2. 由命令输入获取board、target和arg.

board=$
target=$2
shift;shift;
arg=$@

3. 通过board名字在target.conf获取必要的配置。

configs=( $(awk '$1 == "board-a"' target.conf) )
ubootdefcfg=${configs[]}
kerneldefcfg=${configs[]}
menu=${configs[]}

4. 对不同的target调用不同的对象。

build_kernel()
{
...
} build_uboot()
{
...
} main()
{
...
if [ -n "${build_$target}" ]; then
build_$target
fi
...
} main $*

这样,如果target是kernel, 则会运行build_kernel函数。

为编译命令添加自动完成功能

无论新手老手,都不可能记住很多杂乱的东西。所以,需要查看target.conf以知晓支持哪些machine。并且,对应target和argc,则更是两眼一抹黑。kernel和uboot可能使用得多,记得牢固一些。但是其它的target的?比如说,单独编译Camera的App,target应该输入什么?错一个字都不行。

所以,需要为编译命令添加自动完成功能。

1. 不用查看target.conf,就能知道支持哪些board.

2. 输入一个C,按一下tab键,Camera App的target就能列举出来。

3. 输入一个-,就能列举支持的参数。

自动完成的实现

要实现自动完成功能,只需要使用complete对Bash完成自动完成功能的注册就可以。

1. 为了不用在每次使用前都手工注册,准备completion.sh文件,并且在.bashrc中加入语句:

source .completion.sh

2. .completion.sh的内容如下:

function _bb_completion()
{
if test -x build/bb_completion; then
COMPWORDS=${COMP_WORDS[@]};
export COMPWORDS COMP_CWORD;
COMPREPLY=( $(build/bb_completion) );
fi
} function _build_completion()
{
if test -x build/build_completion; then
COMPWORDS=${COMP_WORDS[@]};
export COMPWORDS COMP_CWORD;
COMPREPLY=( $(build/build_completion) );
fi
} complete -F _bb_completion bb
complete -F _build_completion build

真正会在shell开始运行时执行的是complete -F _bb_completion bb,其它的部分只是载入到环境变量当中。

比如,运行type _bb_completion,得到结果

: type _bb_completion
_bb_completion is a function
_bb_completion ()
{
if test -x build/bb_completion; then
COMPWORDS=${COMP_WORDS[@]};
export COMPWORDS COMP_CWORD;
COMPREPLY=($(build/bb_completion));
fi
}
:

运行complete | grep bb,得到结果complete -F _bb_completion bb,表明这个自动完成项目被注册了。

在bash侦测到用户敲击tab键之后,就会去调用与输入程序名bb匹配的自动完成函数_bb_completion。

3.  _bb_completion把运行权交给当前目录下的build/bb_completion文件。在bb_complete中,返回COMPREPLY所需要的值,bash根据COMPREPLY的值显示自动完成的提示结果。

build/bb_completion文件的内容

bb_completion()
{
COMPWORDS=( $COMPWORDS );
local cur="${COMPWORDS[COMP_CWORD]}"
local pre="${COMPWORDS[COMP_CWORD - 1]}"
local args="" for i in ""; do
case "${COMP_CWORD}" in
) # get board list from target.conf
args="$(awk '$1 ~ /^[^#]/ { print $1 }' target.conf)"
;;
*) # extra arguments
case "${cur}" in
-*)
args="-c -f"
break;;
esac
;;
esac
done if test -n "${args}"; then
echo $(compgen -W "${args}" -- ${cur});
fi } bb_completion

自动完成处理时,对参数位置、当前参数和前一个参数进行判断,给出适当的自动完成内容。

比如,当参数位置为1时,希望输入<board>。<board>从target.conf文件中进行抽取。

4. target的产生。

除了kerenl, u-boot等常用的target之外,通常还会有需求编译其它的target。这些target数量巨多,正是自动完成的用武之地。无论是Android还是Yocto编译系统,都有产生完整的target列表的方法。将target列表保存下来,供自动完成使用,这样,在命令输入的时候,会很方便,也有助于初学者理解编译系统的target资源。

Yocto系统,bitbake machine -c listtasks 将列出所有的target.

Android系统,下面的target将罗列出所有的App package.

show-packages:
@$(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES), echo '$(m)';)

Yocto和Android编译命令的简化和自动完成的实现的更多相关文章

  1. Android 编译命令 make j8 2>&1 | tee build.log 解释

    在编译Android的时候,经常看到这样的命令 make  -j8 2>&1 | tee build.log  其中 make 是编译命令, -j8 这里的 8 指的是线程数量,就是你要 ...

  2. 【Android】MTK Android 编译命令

    命令格式:./maketek [option] [project] [action] [modules] Option: -t ,-tee :输出log信息到当前终端 -o , -opt=-- : 编 ...

  3. MTK Android 编译命令

    一.Target 编译命令 usage: (makeMtk|mk) [options] project actions [moudles] options:       -t,-tcc         ...

  4. Mtk Android编译命令

    一.输入命令: cbk@YCS:~/work/k6/alps$ ./mk help Usage: (makeMtk|mk) [options] project actions [modules] Op ...

  5. 理解Android编译命令(转)

    一.引言 关于Android Build系统,这个话题很早就打算整理下,迟迟没有下笔,决定跟大家分享下.先看下面几条指令,相信编译过Android源码的人都再熟悉不过的. source setenv. ...

  6. Android编译命令

    目录 说在前面 编译流程 编译指令 代码编译 代码检索 其他指令 说在前面 从最开始接触Android系统开始,每次进行代码编译都需要网上搜索编译指令.后来大致熟悉了Android的编译体系,加深了对 ...

  7. mtk Android 编译命令自定义--添加版本号

    1. alps\build\core\Makefile文件:(参照CUSTOM_BUILD_VERNO) ifeq "" "$(SURPLUS_BUILD_VERNO)& ...

  8. 【转】Android源代码编译命令m/mm/mmm/make分析--不错

    原文网址:http://blog.csdn.net/luoshengyang/article/details/19023609 在前文中,我们分析了Android编译环境的初始化过程.Android编 ...

  9. android的m、mm、mmm编译命令

    android的m.mm.mmm编译命令的使用 android源码目录下的build/envsetup.sh文件,描述编译的命令 - m:       Makes from the top of th ...

随机推荐

  1. torch.utils.data.DataLoader()中的pin_memory参数

    参考链接:http://www.voidcn.com/article/p-fsdktdik-bry.html 该pin_memory参数与锁页内存.不锁页内存以及虚拟内存三个概念有关: 锁页内存理解( ...

  2. keepalived健康检查方式【转】

    keepalived具有很强大.灵活的后端检测方式,其具有HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK 几种健康检测方式 ,在分别介绍各种检测方式之 ...

  3. 第三周 数据分析之概要 Pandas库数据特征分析

    数据的排序: 数据的基本统计分析 : 数据的累计统计分析: 数据的相关分析: 单元小结

  4. C++设计模式——模板方法模式

    模板方法模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不 ...

  5. ES--06

    第51.初识搜索引擎_上机动手实战多搜索条件组合查询 课程大纲 GET /website/article/_search{ "query": { "bool": ...

  6. JVM·垃圾收集器与内存分配策略之垃圾回收算法!

    1.垃圾回收算法    1.1.标记-清除算法(Mark-Sweep):             过程分为“标记”和“清除”两个过程.先将所有需要回收的目标统一标记,然后再统一清除.          ...

  7. node express+socket.io实现聊天室

    参照网址:https://www.jb51.net/article/135058.htm https://www.cnblogs.com/limitcode/p/7845168.html https: ...

  8. 数据库链接池c3p0的配置

    由于我看的是远古教程,所以里面各种驱动jar包还有c3p0包都是远古版本,对于最新版本的jdbc已经失去的作用,所以我在这里重写一下! 1.首先是c3p0的位置,package的外面,src的里面 2 ...

  9. ABP使用Miniprofiler监测EF

    在上篇教程中,我们在WebApi项目中集成了Miniprofiler,本篇文章中,将继续集成Miniprofiler EF6,以实时监测分析EF的执行语句.执行效率等.Miniprofiler会针对E ...

  10. 与大V一对一沟通 欢迎迷茫的你和优秀的你

    当当当~有个筹备一年的平台终于要发布啦! 在这一年中,他们的专业团队对现行货币市场进行精准分析,了解币圈用户所想的问题以及现在用户最想在平台上能够解决什么样问题后,推出了这样一个平台. 那就是ImCa ...