• Yocto和Android编译命令的简化和自动完成的实现


    简化编译命令

    无论是在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=$1
    target=$2
    shift;shift;
    arg=$@

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

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

    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 "1"; do case "${COMP_CWORD}" in 1) # 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)';)
  • 相关阅读:
    JMeter 配置元件之HTTP Cookie Manager 介绍
    JMeter 线程组之Stepping Thread Group插件介绍
    JAVA JVM常见内存参数配置简析
    JMeter JMeter远程分布式联机性能测试
    JMeter JMeter自身运行性能优化
    SoapUI 访问代理设置
    SoapUI 利用SoapUI进行简单的接口并发测试
    JMeter Sampler之BeanShellSampler的使用
    JMeter 配置元件之计数器Counter
    JMeter 查看结果树监听器响应数据中文显示乱码解决方法
  • 原文地址:https://www.cnblogs.com/zjsxdmif/p/10115132.html
Copyright © 2020-2023  润新知