长话短说,没有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 命令自动补全的脚本,(
)反正很简单,当时对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,年底前总算了有个了结了。