2018年7月23日 星期一

我覺得 premake 做對的事

premake 是一個用途如同 cmakemeson 之類,幫忙你「產出指定編譯工具的專案檔」的自動工具。

假設你有一個自行開發的跨平台軟體專案,需要能被 Windows MSVC / Linux Make / MacOSX XCode 三個編譯平台所編譯。最直覺的作法就是分別建立三個編譯工台的專案檔,也就是 MSVC 的 solution 檔案、Makefile、以及 XCode 用的 workspace 檔案。這個作法在維護上會有一個大問題 -- 每當你新增了原始碼檔案、或是變更了某個編譯設定,你必須要記得同時去更新另外兩個平台的專案檔,否則下次有人在另一個平台上工作時就會氣急敗壞地嚷嚷著編譯失敗。

而 premake / cmake / meson (以及其它族繁不及備載) 這類工具,就是試圖解決這個問題。通常它們的作法是: 你必須改按照它們的方式來編寫專案設定檔,然後透過這份專案設定檔來一次生成所有目標編譯工具 (MSVC / XCode / Make ...) 的專案檔。



嚴格上來說,目前 premake 的生態系還完全無法與 cmake、meson 相提並論 (太小)。功能上,以最新的版本 premake5 來看,能夠無痛應用 premake 的範圍還是限定在桌面應用。尚未觸及到移動平台。不過在我嘗試將 premake 導入到一個現有專案中、實際使用了一陣子之後,還是發現它有兩個獨有的亮點。讓我覺得有朝一日也許它有機會脫穎而出。

亮點一是 premake 工具本身,可以用單一執行檔的方式來散佈。premake 是純 C 編寫而成、內嵌了 Lua 5.3 虛擬機、且運行時不依賴任何第三方動態函式庫。官網上已有提供 Windows / Linux / MacOSX 三個平台上預編譯好的 premake binary 執行檔下載點。其它平台如 FreeBSD,也只要 checkout 它的 source 後自行編譯出這個單一執行檔即可。直接把這些單一執行檔提交進專案的 svn/git repo 之後,你不但有一個跨平台的專案檔產出工具,它還免費附帶一個 Lua 5.3 VM 讓你可以隨時執行 Lua 腳本完成一些自動化的事。對比於 meson,你還必需要求所有開發人員的電腦上都要有 Python3 環境才行。

亮點二是 premake 工具的專案設定檔 -- 它實際上就是一個合法的 Lua 腳本。因此,當你指定一個專案設定檔給 premake 的時候,它實際上是把它視為一個 Lua 腳本、交給內嵌的 Lua 虛擬機執行。所以你當然也可以用 premake5 --file=xxx.lua 去執行你的任何 Lua 腳本做任何你想做的事 (也就是說,xxx.lua 並不一定要是一個專案設定檔)。又因為 premake 的專案設定檔本身就是合法的 Lua 腳本,較為複雜的 if - else 邏輯、迴圈等等,都能直接利用 Lua 語言來實現。對比於 cmake 內部自行實現的控制語句,我會覺得那比較像一種 DSL -- 必須要再學一套「方言」專門跟 cmake 溝通,有點不划算。



沒有留言:

張貼留言