天天看點

展訊智能機平台8810的編譯腳本解析

./mk -o=eng:1sim:gplusc project_8810 u adr packages/apps/Contacts

這是一個編譯apk的指令,先開個頭,大緻記錄一下分析結果。

先從mk檔案開始,mk就是一個perl檔案了,裡面的第一行:

#!/usr/bin/perl -w    //指定了perl解釋器的存放位置

require "customize/perl/main.pl"; // include另外一個perl檔案main.pl

在main.pl 中:

1.  $ARGV[0] =~ /^-(o|op|opt)=(.*)$/  //搜尋“-o” 開頭的輸入參數

2.  @bopt = split(":", $2);    // 以“:”分隔符将輸入參數存入bopt這個數組中(eng 1sim gplusc)

3.   周遊@bopt這個數組将eng/1sim/gplusc分别存入标量$mode/$sim/$gplusc  (eng/1sim是預設支援的option,gplusc是新增加的option)

4.   "project_8810"存入$project ,  "u"存入$action, "adr packages/apps/Contacts"存入@input_module

5.   &parse_custmake(${project});   // 調用函數parse_custmake來檢測customize/make/$project.mak是否存在

6.   @acts = split(",", $action);   //$action 可能是以“,”分隔的多個action,是以轉換成數組@acts

7.   $result = &act_convey(\@acts, \@cust_act); // 調用act_convey函數來将使用者輸入的簡單參數轉換成标準參數,比如将“u”轉換為“update”

8.  判斷@input_module, 先比對到“adr”,然後将 packages/apps/Contacts 存入 $CUR_MODULE_PATH

9.  gen_makeini(\@acts);  // 根據@acts數組生成ini檔案

10. &system_call("perl customize/perl/prebuild.pl  customize/make/${project}.mak   2>&1 | tee $logdir/${project}_prebuild.log");  // 如果($uAct eq "new") or ($uAct eq "update") ,那麼就需要做prebuild操作

11. $result += &system_call("$makeCmd $uMod CUR_ACTION=$uAct CUR_MODULE=$uMod KMOD_PATH=$CUR_MODULE_PATH");  // 如果if($uAct =~ /(update|clean|packet)/i) 條件滿足,即update某個子產品,則執行make指令:$makeCmd = "make -f customize/make/makefile.sprd $cmdArg @mOpts"; make指令的目标是$uMod,在這裡即為“android”

12.  再往下就是到makefile.sprd執行 target=android的腳本了。

繼續閱讀