前文premake在Ubuntu和GCC環境下創建簡單的C++工程中舉了一個例子,雖然能work,但是並不是很了解。後來花了點時間看了lua的語法,自以為理解了,再回頭來看,發現還是有些不懂。現在明白了,premake雖然基於lua,但是也有自己的一些語法。標准的lua語法在premake中是肯定可以用的。 現在來細說一下原來的例子中的腳本。 [plain] -- A solution contains projects, and defines the available configurations solution "Hello1" configurations { "Debug", "Release" } -- A project defines one build target project "Hello1" kind "ConsoleApp" language "C++" files { "**.h", "**.cpp" } configuration "Debug" defines { "DEBUG" } flags { "Symbols" } configuration "Release" defines { "NDEBUG" } flags { "Optimize" } 注意: 1. 這些solution, configurations等都是function, 並不是變量,這裡和lua標准語法不一樣(標准寫法也可以),而是用premake自定義的規則,有空格,有{ }號等。 2. solution可以包含多個project,語法參考http://industriousone.com/solution,solution管理多個project,這個設計很實用。 3. configurations接受的參數是每一段configuration的名字,自己應該在每個project中定義對應的configuration的設置。必須在所有project定義前調用configurations。 4. configurations函數的參數,Debug放在最前面,也就意味著將來產生的*.make文件中,Debug會作為默認設置。如果現在將Release放在最前面,生成make文件後,會看到: [plain] ifndef config config=release endif 當make不傳遞參數時,就會默認使用release配置。 5. project裡面可以通過configuration進行設置 ,文檔:http://industriousone.com/project,裡面有錯誤: [plain] solution "MySolution" configuration { "Debug", "Release" } // should be configurations project "MyProject" 6. 注意kind,即可用在configuration裡面,也可用在project裡面。文檔:http://industriousone.com/kind 7. configuration就是對應3中的配置函數。注意,可以用通配符,比如"*Lib"或則“*DLL”來匹配configurations中的參數。configuration函數之後所有的配置都屬於這個configuration,直到遇到下一個configuration為止。在我的例子中,後續的只有defines和flags函數。文檔:http://industriousone.com/configuration 8. defines用來給一個project添加預處理或者編譯符號。前面兩個configuration裡面分別用來一次define,看一下: [plain] configuration "Debug" defines { "DEBUG" } 和 [plain] configuration "Release" defines { "NDEBUG" } 結果在生成的Hello1.make文件中,我們看到生成了對應的gmake指令:-DDEBUG和-DNDEBUG [plain] ifeq ($(config),debug) OBJDIR = obj/Debug TARGETDIR = . TARGET = $(TARGETDIR)/Hello1 DEFINES += -DDEBUG 和 [plain] ifeq ($(config),release) OBJDIR = obj/Release TARGETDIR = . TARGET = $(TARGETDIR)/Hello1 DEFINES += -DNDEBUG 9. flags用來指定編譯或者鏈接過程中的標識,查看文檔:http://industriousone.com/flags 我這裡用了最普通的, "Symbols" 允許編譯出調試信息,"Optimize"編譯優化,一般為Release准備。 10. premake指令可以簡化為: [plain] premake4 --file=config.lua gmake 原來的 [plain] premake4 --file=config.lua --os=linux --platform=x64 gmake 有副作用。特別是--platform=x64會導致產生的make文件中有debug64和release64的配置。還是由自己控制的比較好。 11. 最後介紹一個添加文件和目錄,甚至排除某些文件的用法。參考:http://industriousone.com/adding-files 有了這個,就沒必要像一般的makefile每個目錄都寫makefile,和cmake差不多方便了。