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

来源:互联网 发布:西恩潘 知乎 编辑:程序博客网 时间:2024/05/21 19:20

长话短说,没有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 cwordcase $cword in0) ;;*) 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,年底前总算了有个了结了。





0 0
原创粉丝点击