Afraid of Makefiles? Don't be!

Matthias Endler

害怕 Makefile?別怕!

原文由 Matthias Endler 發布,訂閱此部落格

衣服跟 Makefile 有什麼關係?在這篇文章中找出答案!
衣服跟 Makefile 有什麼關係?在這篇文章中找出答案!
來源: 插圖由 Anindyanfitri 創作 - Freepik.com

過去幾年來,我有幸與許多優秀的軟體工程師共事。讓我印象深刻的是,他們之中有很多人對 Makefiles 沒有實際的操作經驗,也不了解它有什麼用處。

當需要自動化建置流程時,他們常常自己寫 shell 腳本來處理。常見的例子就是在專案資料夾裡看到叫做 build.shrun.shdoall.sh 的檔案。

他們一再重複實作相同的基本功能:

  • 解析輸入參數與環境變數。
  • 手動管理建置步驟之間的相依關係。
  • 錯誤處理(……如果有的話)。

在這個過程中,他們也一再犯下同樣的基本錯誤:

這些正是 Makefile 當初被發明來解決的問題。

Makefile 很可怕!

如果你覺得 make 很可怕,你想到的可能是那些大型軟體專案中複雜的建置系統。其實不一定非得如此。來聽聽 make 的作者 Stuart Feldman 本人怎麼說:

一開始有個很複雜的相依性分析器的構想,後來簡化成簡單許多的東西,並在那個週末變成了 Make。拿還沒成熟的工具來用是當時文化的一部分。Makefile 是純文字檔,而不是神祕編碼的二進位檔,因為那就是 Unix 的精神:可列印、可除錯、可理解的東西。

The Art of Unix Programming (2003)

Make 只花了一個週末就被打造出來,用簡單的方式解決一個一再出現的問題。

Makefile 其實很簡單!

出門前,我得先把衣服穿好。每次我都遵循同樣簡單的流程:內褲、長褲、襯衫、套頭毛衣、襪子、鞋子、外套。想必你也有自己的穿衣順序,就算跟我的不一樣也沒關係。

其中有些步驟彼此之間有相依關係。
Make 很適合用來處理相依關係。
讓我們試著把我的穿衣流程寫成一個 Makefile

dress: trousers shoes jacket
	@echo "All done. Let's go outside!"

jacket: pullover
	@echo "Putting on jacket."

pullover: shirt
	@echo "Putting on pullover."

shirt:
	@echo "Putting on shirt."

trousers: underpants
	@echo "Putting on trousers."

underpants:
	@echo "Putting on underpants."

shoes: socks
	@echo "Putting on shoes."

socks: pullover
	@echo "Putting on socks."

如果我們執行這個 Makefile,會得到以下輸出:

$ make dress
Putting on underpants.
Putting on trousers.
Putting on shirt.
Putting on pullover.
Putting on socks.
Putting on shoes.
Putting on jacket.
All done. Let's go outside!

剛剛發生了什麼事?

有沒有注意到步驟都按照正確的順序執行了?只要清楚寫下步驟之間的相依關係,make 就能幫我們正確地執行它們。

每個建置步驟的結構如下:

target: [dependencies]
	<shell command to execute>
	<shell command to execute>
	...
  • 當我們執行 make 時,Makefile 中的第一個 target 會被預設執行。

  • target 的先後順序並不重要。

  • Shell 指令必須以 tab 縮排。

  • 在指令前加上 @ 符號可以隱藏該指令本身的輸出。

  • 如果 target 並不是你要產生的檔案,請在建置步驟結尾加上 .PHONY <target>。常見的 phony target 有:clean、install、run……否則,如果有人建立了一個叫做 install 的目錄,make 就會因為建置目標已存在而悄悄失敗。

    .PHONY: install
    install:
    	npm install

恭喜!你已經學會了關於 make 需要知道的 90%。

下一步

真正的 Makefiles 還能做更多事!它們會只建置有變更的檔案,而不是每次都全部重新建置。而且它們會盡可能平行處理。不過,還是盡量保持簡單就好。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言