构建工具Premake
经常用Visual Studio写一些小程序来验证OpenCASCADE的功能,每次创建项目后都配置头文件,库路径,程序运行时还要配置Debug的环境变量,比较麻烦。也尝试过CMake和QMake,都不太理想。CMake学习曲线陡峭一点,还会生成一堆文件。QMake简单些,但是有的选项不支持。直到看到一个开源的游戏程序Overload,看其编译说明使用了Premake来构建。
使用IMGUI生成的软件界面比较酷炫,使用Premake生成Visual Studio解决方案。
1 什么是构建系统
构建系统(BuildSystem)是用来从源码生成用户可以使用的目标(Targets)的自动化工具。目标可以包括库,可执行文件,或者生成的脚本等等。
项目模块依赖关系维护 ;
目标的可配置化(不同系统:Windows,Mac…;不同平台:Win32,Win64,Amd64…)
目标生成的自动化
2 为什么使用构建系统
主要用于提高开发人员的效率与稳定,测试与发布的效率
-减少开发人员的知识成本(比如对同一流程,但多种平台,多种开发环境差异化的了解)
-减少项目项目变动的维护成本
– VisualStudio 的编译选项规则,配置方法
– Xcode 的编译选项规则,配置方法
– 其他。。。
-减少模块的维护成本
– 协同人员对工程文件,目录的修改冲突
减少平台,系统生成的差异化成本(可以简洁地配置不同的平台与系统)
– 通过简单的配置,可以灵活,快速地添加,修改,更新模块
– 可以方便的处理依赖关系,提高稳定性和编译速度
使用脚本和配置文件,实现自动清理,生成所需平台,系统,调试环境,测试流程,然后发布版本。
总的来说,就是使生成过程更加简洁,灵活,高效,自动化。
3 常见的构建系统
主流的可以跨平台,支持C++的构建系统
- CMake
- Scons
- Premake
其他还有 GNU Make,GNU autotools,Apache Ant(主要用于Java),Gradle(主要用于Java)
4 什么是Premake
Premake 是一种命令工具,通过读取项目脚本,来生成各种开发环境的项目文件。主要用于:
生成开发人员喜欢的平台,工具集(协同开发的人员,可以使用不同的平台和开发工具)
通过脚本保持不同平台,工具集下的项目配置同步(比如新建文件夹,引入新的库文件)
通过脚本来快速更新许多不同的大型代码库,并重新生成项目(比如对依赖的多种著名库的版本更新)
快速升级工具集的版本(比如无缝地从VisualStudio 2010升级到VisualStudio 2019)
目前支持:
Microsoft Visual Studio 2005-2019
GNU Make,包括 Cygwin 和 MinGW
XCode
Codelite
Premake 5.0 目前支持:
32 和 64 位平台
Xbox 360(仅支持Visual Studio)
插件模块可以支持其他语言,框架,和工具集
Premake 是存粹的旧版C应用程序,发布为一个单个的,非常小的exe文件。支持完整的Lua脚本环境
开源地址:https://github.com/premake/premake-core
下载地址:https://premake.github.io/
实例地址:https://github.com/wuguyannian/tutorial_premake
5 使用Premake
使用premake来构建一个使用了glfw, occt和imgui的程序。从配置文件可以看出,配置比CMake要简单:
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"
}
通过premake生成的Visual Studio解决方案很干净,没有多余的文件。后面再要写一个小的验证程序时,只需要复制premake5.lua修改一下即可,很方便。对于小的验证程序来说,使用premake是理想的构建工具。