iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
  • make
    • 是一個command
    • make是Linux下的一款程序自動維護工具
    • make 會自動的判別原始碼是否經過變動,而自動更新執行檔
  • makefile
    • 是一個檔案,名稱是makefile的檔案,裡面會由開發者寫一些編譯說明
  • make配合makefile的使用
    • 就能夠根據程序中模塊的修改情況
    • 自動判斷應該對那些模塊重新編譯
      • make的中心思想,怎麼做到的上述自動判斷及更新?
        • 為每個模塊都設置時間標記
        • 根據時間標記和依賴關係來決定哪些文件需要更新
        • if 依賴模塊的狀態改變
          • 就跟據時間的新舊和預先定義的一組命令
          • 生成新目標
  • 為何make需要makefile?
    • make只是內建提供許多功能
    • make無法知道如何/你想怎樣建立應用程式
    • 故必須提供一個檔案,即 makefile
    • makefile目的即告訴 make 如何建立應用程式
  • 為何需要這樣的自動維護工具?
    • 首先直譯式語言應不需要這種東西 e.g. python, javascript
    • 需要經過編譯的如C++, C
    • 編譯需要花時間的
    • 假設
      • 有1000個文件,跟幾個人合作分別修改了其中13個source code file
      • 有些東西會環環影響
      • 沒有工具的情況下,需人工確定受影響的source code file
      • 進行重新編譯
      • 我們光是修改變數名稱都會想要直接用fine&replace了
      • 麻煩
    • make就是自動幫我們確認受此次修改影響的source code file有哪些
    • 然後進行重新編譯
    • 節省時間
  • make 有很多選項,跟一般command用一槓加個字母-字母作為選項,常用的:
    • -k: --keep-going的縮寫,概念就是先做一遍作業,不會做的、卡住的就跳過
    • -n: --just-print--dry-run的縮寫,跟彩排一樣,不是真跑,就先大概過一遍流程
    • -f: --file--makefile的縮寫,後面要加裡面有寫好makefile內容的檔案路徑+名稱
      • 是make指令必備的選項
      • 但make也有做好預備
      • 你沒給他指明要follow的檔案
      • 他會自動去找當前目錄名為makefile或Makefile或GNUmakefile的檔案來讀
        • 至於先找哪個來讀
        • 就是看不同OS作業系統的make預設是先找誰了
        • 目前的慣例應該是用Makefile
        • 我在AOSP裡也是看到開頭大寫的Makefile
  • 一般一個project用一個Makefile就可以
  • 太大的project就得用多個Makefile
    • 例如AOSP
    • AOSP除了用Makefile,還會用Android.mk, Android.bp之類的
  • makefile的內容
    • 描述系統中模塊之間的相互依賴關係
    • 以及generate編譯後的文件所需的指令
    • 簡言之:內容包含依賴關係和編譯指令兩種
    • makefile是有語法要遵守的(簡單例子就跟寫markdown一樣)
      • 以C為例子
        • 執行檔只有名稱沒有副檔名
        • 編譯後的c檔稱作object file,副檔名.o
        • c檔source code的副檔名.c
        • c檔的header file的副檔名.h
      • 語法
        • 最後依賴的要寫在最上行,最後的執行檔就是用到最後的依賴
        • 一開始需要先指定用.c檔跟.h檔生成.o檔
        • 然後再用.o去生成最後的執行檔
      • 例子(很模糊隨便舉的喔)
        • 我的main是個同時有camera跟audio功能的執行檔
        • 分別寫了camera.c跟audio.c
          • 各自有自己的camera.h跟audio.h
          • audio需要額外的library支援,tool.h
        • camera需要用到一些audio的東西,所以camera會依賴(include?)audio.h
        • 然後main.c會去呼叫camera跟audio,然後因為camera有些東西需要在main就能直接呼叫到,所以main會依賴(include?)camera.h
        //最終生成執行檔: 依賴生成檔案1, 依賴生成檔案2, ...
        //...
        //生成檔案: 依賴檔案1, 依賴檔案2, ...
        main: main.o camera.o audio.o
        main.o: main.c camera.h
        camera.o: camera.c camera.h audio.h
        audio.o: audio.c audio.h tool.h
        
        • 如果冒號後面的檔案改了,冒號前面的檔案也要重新編譯
        • 第一次編譯4行都會執行
          • 第一次會比較久
        • 之後如果audio.c改了
          • camera.o跟main.o都不會被影響
          • 所以只會執行audio.o跟main即第4行跟第1行
    make 與 makefile
    深入學習Make命令和Makefile(上)

 
 


上一篇
BSP?
下一篇
總有一天得過了數學這道坎
系列文
AOSP(Android Open Soure Project)學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
小克
iT邦新手 4 級 ‧ 2023-02-02 12:08:36

感謝分享!

我也寫一篇 makefile 的文章,歡迎交流
https://blog.goodjack.tw/2023/01/use-makefile-to-manage-workflows-for-web-projects.html

我要留言

立即登入留言