android makefile(android.mk)分析(1)

來源:互聯網
上載者:User

1.1 makefile helloworld

Makefile的規則如下:

target ... : prerequisites ...

command ... ...

target可以是一個目標檔案,也可以是Object File(例如helloworld.obj),也可以是執行檔案和標籤。

prerequisites就是產生target所需要的檔案或是目標。

command也就是要達到target這個目標所需要執行的命令。這裡沒有說“使用產生target所需要執行的命令”,是因為target可能是標籤。需要注意的是command前面必須是TAB鍵,而不是空格,因此喜歡在編輯器裡面將TAB鍵用空格替換的人需要特別小心了。

我們寫程式一般喜歡寫helloworld,當我們寫了一個c的helloworld之後,我們該如何寫helloworld來編譯helloworld.c呢?

下面就是編譯helloworld的makefile。

helloworld : helloworld.o

    cc -o helloworld helloworld .o

helloworld.o : helloworld.c

    cc -c main.c

clean:

    rm helloworld helloworl.o

之後我們執行make就可以編譯helloworld.c了,執行make clean就可以清除編譯結果了(其實就是刪除helloworld helloworl.o)。

可能有人問為什麼執行make就會產生helloworld呢?這得從make的預設處理說起:make將makefile的第一個target作為作為最終的

target,凡是這個規則依賴的規則都將被執行,否則就不會執行。所以在執行make的時候,clean這個規則就沒有被執行。

上面的是最簡單的makefile,複雜點makefile就開始使用進階點的技巧了,例如使用變數,使用隱式規則,執行負責點shell命令(常見的是字串處理和檔案處理等),這裡不打算介紹這些規則,後面在分析android的makefile時會結合具體代碼進行具體分析,大家可以先看看陳皓的《跟我一起寫makefile》來瞭解瞭解。

makefile的大體的結構是程式樹形的,如下:

                                                    

這樣寫起makefile也簡單,我們將要達到的目標作為第一個規則,然後將目標分解成子目標,然後一個個寫規則,依次類推,直到最下面的規則很容易實現為止。這其實和演算法裡面的分治法很像,將一個複雜的問題分而治之。

說到樹,我想到了編譯原理裡面的文法分析,文法分析裡面有自頂而下的分析方法和自底而下的分析方法。當然makefile並不是要做文法分析,而是要做與文法分析分析相反的事。(文法分析要做的是一個句子是不是根據文法可以推出來,而makefile要做的是根據規則產生一個command 執行隊列。)不過makefile的規則和詞法分析還是很像的。下面出一道編譯原理上面的一個例子,大家可以理解一下makefile和詞法分析的不同點和相同點:

<標識符>  -> <字母><字母數字串>
    <字母數字串>  -> <字母><字母數字串>|<數字><字母數字串>|<底線><字母數字串>|ε
   <不帶正負號的整數> -> <數字><數字串>
   <數字串> -> <數字><數字串>|ε
  <加法運算子>  -> +
   <減法運算子> -> -
  <大於關係運算子> -> >
   <大於等於關係運算子> -> >=

 

最後,介紹一下autoconfautomake,使用這兩個工具可以自動產生makefile。

從上面的圖可以看出,通過autoscan,我們可以根據代碼產生一個叫做configure.scan的檔案,然後我們編輯這個檔案,參數一個configure.in的檔案。接著我們寫一個makefile.am的檔案,然後就可以用automake產生makefile.in,最後,根據makefile.in和configure就可以產生makefile了。在很多開源的工程裡面,我們都可以看到makefile.am,configure.in,makefine.in,configure檔案,還有可能看到一個十分複雜的makefile檔案,許多人學習makefile的時候想通過看這個檔案來學習,最終卻發現太複雜了。如果我們知道這個檔案是自動產生的,就理解這個makefile檔案為什麼這個複雜了。

欲更加詳細的理解automake等工具,可以參考http://www.ibm.com/developerworks/cn/linux/l-makefile/。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.