構(gòu)建工具Premake
經(jīng)常用Visual Studio寫一些小程序來(lái)驗(yàn)證OpenCASCADE的功能,每次創(chuàng)建項(xiàng)目后都配置頭文件,庫(kù)路徑,程序運(yùn)行時(shí)還要配置Debug的環(huán)境變量,比較麻煩。也嘗試過(guò)CMake和QMake,都不太理想。CMake學(xué)習(xí)曲線陡峭一點(diǎn),還會(huì)生成一堆文件。QMake簡(jiǎn)單些,但是有的選項(xiàng)不支持。直到看到一個(gè)開(kāi)源的游戲程序Overload,看其編譯說(shuō)明使用了Premake來(lái)構(gòu)建。

使用IMGUI生成的軟件界面比較酷炫,使用Premake生成Visual Studio解決方案。
1 什么是構(gòu)建系統(tǒng)
構(gòu)建系統(tǒng)(BuildSystem)是用來(lái)從源碼生成用戶可以使用的目標(biāo)(Targets)的自動(dòng)化工具。目標(biāo)可以包括庫(kù),可執(zhí)行文件,或者生成的腳本等等。
項(xiàng)目模塊依賴關(guān)系維護(hù) ;
目標(biāo)的可配置化(不同系統(tǒng):Windows,Mac…;不同平臺(tái):Win32,Win64,Amd64…)
目標(biāo)生成的自動(dòng)化
2 為什么使用構(gòu)建系統(tǒng)
主要用于提高開(kāi)發(fā)人員的效率與穩(wěn)定,測(cè)試與發(fā)布的效率
-減少開(kāi)發(fā)人員的知識(shí)成本(比如對(duì)同一流程,但多種平臺(tái),多種開(kāi)發(fā)環(huán)境差異化的了解)
-減少項(xiàng)目項(xiàng)目變動(dòng)的維護(hù)成本
– VisualStudio 的編譯選項(xiàng)規(guī)則,配置方法
– Xcode 的編譯選項(xiàng)規(guī)則,配置方法
– 其他。。。
-減少模塊的維護(hù)成本
– 協(xié)同人員對(duì)工程文件,目錄的修改沖突
減少平臺(tái),系統(tǒng)生成的差異化成本(可以簡(jiǎn)潔地配置不同的平臺(tái)與系統(tǒng))
– 通過(guò)簡(jiǎn)單的配置,可以靈活,快速地添加,修改,更新模塊
– 可以方便的處理依賴關(guān)系,提高穩(wěn)定性和編譯速度
使用腳本和配置文件,實(shí)現(xiàn)自動(dòng)清理,生成所需平臺(tái),系統(tǒng),調(diào)試環(huán)境,測(cè)試流程,然后發(fā)布版本。
總的來(lái)說(shuō),就是使生成過(guò)程更加簡(jiǎn)潔,靈活,高效,自動(dòng)化。
3 常見(jiàn)的構(gòu)建系統(tǒng)
主流的可以跨平臺(tái),支持C++的構(gòu)建系統(tǒng)
- CMake
- Scons
- Premake
其他還有 GNU Make,GNU autotools,Apache Ant(主要用于Java),Gradle(主要用于Java)
4 什么是Premake

Premake 是一種命令工具,通過(guò)讀取項(xiàng)目腳本,來(lái)生成各種開(kāi)發(fā)環(huán)境的項(xiàng)目文件。主要用于:
生成開(kāi)發(fā)人員喜歡的平臺(tái),工具集(協(xié)同開(kāi)發(fā)的人員,可以使用不同的平臺(tái)和開(kāi)發(fā)工具)
通過(guò)腳本保持不同平臺(tái),工具集下的項(xiàng)目配置同步(比如新建文件夾,引入新的庫(kù)文件)
通過(guò)腳本來(lái)快速更新許多不同的大型代碼庫(kù),并重新生成項(xiàng)目(比如對(duì)依賴的多種著名庫(kù)的版本更新)
快速升級(jí)工具集的版本(比如無(wú)縫地從VisualStudio 2010升級(jí)到VisualStudio 2019)
目前支持:
Microsoft Visual Studio 2005-2019
GNU Make,包括 Cygwin 和 MinGW
XCode
Codelite
Premake 5.0 目前支持:
32 和 64 位平臺(tái)
Xbox 360(僅支持Visual Studio)
插件模塊可以支持其他語(yǔ)言,框架,和工具集
Premake 是存粹的舊版C應(yīng)用程序,發(fā)布為一個(gè)單個(gè)的,非常小的exe文件。支持完整的Lua腳本環(huán)境
開(kāi)源地址:https://github.com/premake/premake-core
下載地址:https://premake.github.io/
實(shí)例地址:https://github.com/wuguyannian/tutorial_premake
5 使用Premake
使用premake來(lái)構(gòu)建一個(gè)使用了glfw, occt和imgui的程序。從配置文件可以看出,配置比CMake要簡(jiǎn)單:
workspace "OcctImgui"
configurations {"Debug", "Release"}
system "Windows"
platforms {"Win64"}
architecture "X64"
language "C++"
project "OcctImgui"
kind "ConsoleApp"
language "C++"
targetdir "build/bin/%{cfg.buildcfg}"
objdir "build/obj/%{cfg.buildcfg}"
files { "**.h", "**.cpp"}
-- Header files.
includedirs
{
"C:/OpenCASCADE-7.6.0/opencascade-7.6.0/inc",
"C:/glfw-3.3.8/include"
}
-- Library files.
links
{
"TKernel", "TKMath", "TKG2d", "TKG3d", "TKGeomBase", "TKGeomAlgo", "TKBRep", "TKTopAlgo", "TKPrim", "TKMesh", "TKService", "TKOpenGl", "TKV3d",
"glfw3"
}
filter "configurations:Debug"
defines { "DEBUG" }
symbols "On"
libdirs
{
"C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/libd",
"C:/glfw-3.3.8/lib"
}
debugenvs
{
"path=%path%;C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/bind"
}
filter "configurations:Release"
defines { "NDEBUG" }
symbols "Off"
optimize "On"
libdirs
{
"C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/lib",
"C:/glfw-3.3.8/lib"
}
debugenvs
{
"path=%path%;C:/OpenCASCADE-7.6.0/opencascade-7.6.0/win64/vc14/bin"
}
通過(guò)premake生成的Visual Studio解決方案很干凈,沒(méi)有多余的文件。后面再要寫一個(gè)小的驗(yàn)證程序時(shí),只需要復(fù)制premake5.lua修改一下即可,很方便。對(duì)于小的驗(yàn)證程序來(lái)說(shuō),使用premake是理想的構(gòu)建工具。
