Premake是一款用Lua作为配置语言的轻量级C++构建工具,它可以通过编写简单的Lua脚本,自动生成Visual Studio、Makefile、Xcode等不同平台的工程文件,避免手动配置工程带来的重复劳动和出错风险。

Premake基础概念
Premake的核心逻辑是通过用户编写的premake5.lua脚本定义项目结构、编译选项、依赖关系等信息,然后调用Premake可执行文件解析脚本,生成对应平台的工程文件。它的优势在于配置脚本简洁易读,跨平台适配能力强,不需要像CMake那样学习复杂的专有语法。
环境准备
首先需要下载Premake的可执行文件,到Premake的官方发布页面获取对应系统的版本,解压后将premake5可执行文件放到系统PATH路径下,方便全局调用。之后新建一个C++项目目录,结构可以参考如下:
my_cpp_project/ ├── src/ │ └── main.cpp ├── premake5.lua └── build/
编写基础Premake脚本
在项目根目录创建premake5.lua文件,这是Premake的配置文件,所有项目定义都写在这个Lua脚本中。下面是一个最基础的示例,定义一个控制台应用项目:
-- 指定Premake的版本要求
premake5.lua_version = "5.0"
-- 工作空间配置,对应Visual Studio的Solution
workspace "MyCppProject"
-- 支持的平台架构
architectures { "x86", "x64" }
-- 支持的配置类型
configurations { "Debug", "Release" }
-- 不同配置的编译选项
filter "configurations:Debug"
defines { "DEBUG" }
symbols "On"
filter "configurations:Release"
defines { "NDEBUG" }
optimize "On"
-- 项目定义,对应Visual Studio的Project
project "MyApp"
-- 项目类型,控制台应用
kind "ConsoleApp"
-- 项目语言
language "C++"
-- C++标准
cppdialect "C++17"
-- 源代码目录
files { "src/**.cpp" }
-- 头文件目录
includedirs { "include/" }
-- 输出目录
targetdir "build/%{cfg.buildcfg}/%{cfg.architecture}"
脚本核心配置项说明
- workspace:定义工作空间,是多个项目的容器,可设置全局的架构、配置、编译选项。
- project:定义单个项目,可设置项目类型、源码路径、依赖等属性。
- filter:条件过滤,用于针对不同配置、平台设置差异化的编译参数。
- files:指定项目的源文件,支持通配符匹配,
**表示递归匹配子目录。
生成工程文件并编译
编写完脚本后,打开终端进入项目根目录,执行Premake命令生成对应平台的工程文件:
-- 生成Visual Studio 2022工程 premake5 vs2022 -- 生成Linux下的Makefile premake5 gmake2 -- 生成Xcode工程 premake5 xcode4
以生成Makefile为例,执行premake5 gmake2后,项目根目录会生成Makefile文件,进入build目录执行编译命令即可:
# 编译Debug x64版本 make config=debug_x64 # 编译Release x86版本 make config=release_x86
进阶用法示例
添加静态库项目
如果项目需要依赖静态库,可以在脚本中新增一个静态库项目,然后让主项目依赖它:
-- 静态库项目
project "MyLib"
kind "StaticLib"
language "C++"
cppdialect "C++17"
files { "lib/src/**.cpp" }
includedirs { "lib/include/" }
targetdir "build/lib/%{cfg.buildcfg}/%{cfg.architecture}"
-- 主项目依赖静态库
project "MyApp"
kind "ConsoleApp"
language "C++"
cppdialect "C++17"
files { "src/**.cpp" }
-- 链接静态库
links { "MyLib" }
-- 添加静态库的头文件目录
includedirs { "lib/include/" }
targetdir "build/app/%{cfg.buildcfg}/%{cfg.architecture}"
跨平台条件配置
如果需要针对不同操作系统设置不同的编译选项,可以使用Premake提供的系统判断接口:
project "MyApp"
kind "ConsoleApp"
language "C++"
files { "src/**.cpp" }
-- Windows平台额外配置
filter "system:windows"
defines { "OS_WINDOWS" }
links { "Ws2_32.lib" } -- 链接Windows socket库
-- Linux平台额外配置
filter "system:linux"
defines { "OS_LINUX" }
links { "pthread" } -- 链接pthread库
-- macOS平台额外配置
filter "system:macosx"
defines { "OS_MAC" }
常见问题解答
新手使用Premake时可能会遇到脚本语法错误,此时可以检查Lua脚本的语法是否正确,Premake的报错信息会提示错误的行号和原因。如果生成的工程文件不符合预期,可以检查files、includedirs等路径配置是否正确,通配符是否匹配到了需要的文件。
Premake的脚本是标准的Lua语法,如果熟悉Lua的话可以很灵活地在脚本中添加自定义逻辑,比如自动扫描目录下的源文件、根据环境变量动态调整配置等,扩展性很强。