轻量构建系统 Premake
一 构建系统简介
1.1 什么是构建系统
构建系统(BuildSystem)是用来从源码生成用户可以使用的目标(Targets)的自动化工具。目标可以包括库,可执行文件,或者生成的脚本等等。
- 项目模块依赖关系维护 ;
- 目标的可配置化(不同系统:Windows,Mac…;不同平台:Win32,Win64,Amd64…)
- 目标生成的自动化
1.2 为什么使用构建系统
主要用于提高开发人员的效率与稳定,测试与发布的效率
- 减少开发人员的知识成本(比如对同一流程,但多种平台,多种开发环境差异化的了解)
- 减少项目项目变动的维护成本
– VisualStudio 的编译选项规则,配置方法
– Xcode 的编译选项规则,配置方法
– 其他。。。 - 减少模块的维护成本
– 协同人员对工程文件,目录的修改冲突 - 减少平台,系统生成的差异化成本(可以简洁地配置不同的平台与系统)
– 通过简单的配置,可以灵活,快速地添加,修改,更新模块
– 可以方便的处理依赖关系,提高稳定性和编译速度 - 使用脚本和配置文件,实现自动清理,生成所需平台,系统,调试环境,测试流程,然后发布版本。
总的来说,就是使生成过程更加简洁,灵活,高效,自动化。
1.3 常见的构建系统
主流的可以跨平台,支持C++的构建系统
- CMake
- Scons
- Premake
其他还有 GNU Make,GNU autotools,Apache Ant(主要用于Java),Gradle(主要用于Java)
二 Premake 的下载和使用
2.1 什么是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
2.2 下载和使用
2.2.1 下载Premake
打开上述地址,选择自己系统的版本。
2.2.2 Windows 下使用 Premake
- 新建文件夹Text
- 将premake.exe放到Text文件夹中
- 在文件夹内新建 main.cpp
#include <iostream>
int main()
{
std::cout << "Premake Project Test" << std::endl;
system("pause");
return 0;
}
- 在文件夹内新建 premake5.lua
workspace "Test" -- 解决方案
startproject "Test" -- 开始项目
configurations
{
"Debug",
"Release"
}
platforms
{
"Win32",
"Win64"
}
filter "platforms:Win32"
system "Windows"
architecture "x32"
filter "platforms:Win64"
system "Windows"
architecture "x86_64"
project "Test" -- 项目
kind "ConsoleApp" -- 控制台应用
language "C++"
files
{
"./**.cpp" -- 当前文件夹所有.cpp文件
}
- 在文件夹内输入 cmd Enter。它会自动打开cmd.exe,并切换到当前目录
- 在命令行中输入 premake5.exe vs2019 Enter。
- 会看到 Test.sln 和 Test.vcxproj 的生成,然后打开Test.sln运行
三 Premake 项目构建
3.1 实例项目
- 使用 Visual Studio 2019 创建项目
- 1.创建启动项目
- 2.创建库项目
右键LibUtial项目->属性,应用类型改为静态库
配置输出目录为 $(SolutionDir)bin$(PlatformName)$(Configuration)$(ProjectName)
配置中间目录为 $(SolutionDir)bin_obj$(PlatformName)$(Configuration)$(ProjectName)
右键Totorial项目->属性,输出目录和中间目录同上
附加包含目录 设置为 $(SolutionDir)\LibUtial
右键Tutorial项目->设置为启动项目
右键引用添加引用 LibUtial - 3.添加文件
分别点击两个项目,然后点击上面的按钮显示所有文件
然后点击LibUtial,按 Ctrl + Shift + A 新建 libutil.cpp,libutil.h - 4编辑代码
- libutil.cpp
- libutil.h
- Totorial.cpp
按 F5 得到输出结果
- libutil.cpp
- 1.创建启动项目
- 使用 Premake 创建项目
-
1.新建目录树
- Tutorial
- LibUtial
- Tutorial
- Tutorial
-
2.拷贝文件
- libutil.cpp,libutil.h 到 TutorialP\LibUtial
- Tutorial.cpp 到 TutorialP\Tutorial
- 拷贝 premake5.lua,premake5.exe 到 TutorialP
- 修改 premake5.lua
-
运行 cmd.exe 进入 TutorialP 目录
-
输入 premake5.exe vs2019
-
会看到生成vs2019的项目,打开解决方案,按 F5 会得到相同结果
-
- 实例项目地址
- https://github.com/wuguyannian/tutorial_premake
- 其中.gitignore 忽略添加了vs 2019是为忽略提交TutorialP中VS文件,因为它们依靠premake生成,不需要原生工程文件
3.2 常用 Premake 脚本
- 3.1.1 结构 (简版)
- 解决方案
- 方案名称
- 起始项目
- 配置方案(各平台,各系统)
- 项目1
- 应用类别
- 语言
- 输出路径,中间路径
- 其他
- 项目链接
- 项目配置
- 包含路径
- 源码路径
- 其他
- 项目2
- 项目。。
- 解决方案
- 3.1.2 脚本
- workspace 解决方案名称
- 方案作用域包含所有项目
- startproject 起始项目名称
- configurations 配置名称
- platforms 平台名称
- filter 筛选器
- 用字符串筛选各种配置
- 在条件下添加独特的配置
- system 系统
- architecther 结构(平台)
- project 项目名称
- 项目配置以此划分作用域
- kind 应用类别
- language 语言
- targetdir 输出路径
- objdir 中间路径
- files 编译文件
- 可以使用通配符
- 可以指定具体文件
- 自定义变量(参考Lua)
- workspace 解决方案名称
语法细节:https://github.com/premake/premake-core/wiki 通过下面输入关键词搜索