Premake教程
承接 https://t-rvw.github.io/blog/2022/05/27/game_engine_make/ 提到的Premake编写HelloWorld,本文会介绍更多关于premake如何在C/C++工程中使用的例子。
如果你对于C/C++工程不是非常熟悉,建议先阅读 https://t-rvw.github.io/blog/2022/09/16/native_engineering/ 。
跨平台
- Windows
- 生成Visual Studio工程
- Mac
- 生成XCode工程
- Linux:
- 生成最原始的Makefile,对应参数是gmake2。然后在linux下将它指定生成到项目文件夹根目录,再用make命令跑。
- premake-vslinux
- Visual Studio新版本支持了vslinux的功能,也就是在Windows下配置Linux工程进行编译
- 模块不是自带的,需要集成 + 自行升级/维护:https://github.com/LORgames/premake-vslinux
- 该模块支持到vs2015,关注很少,没人提issue,稳定性不能保证
问答
写系统的教程比较花时间构思,我们暂时以解答的形式在这里更新,以下是之前文章里留下的问题答案:
- Q:把命令行写到Windows下的bat,或者Mac下的cmd里,双击即可执行
- A:新建bat复制make命令很简单,一个更加方便的做法是,新建一个Utility类型的工程,在它每次编译的时候自动调用bat:
1
2
3
4
5
6
7project("AutoMake")
kind("Utility")
prebuildcommands {
"make.bat"
}
prebuildmessage "Making project..."
- A:新建bat复制make命令很简单,一个更加方便的做法是,新建一个Utility类型的工程,在它每次编译的时候自动调用bat:
- Q: 打开sln后,没发现有筛选器,如何添加进来?
- A:筛选器这里指的是VisualStuido IDE里的源码分类文件夹,正常情况是默认生成的,但也有你想定制,或者premake自动生成的文件夹不正确的情况。做法也很简单,填充一个类似C++ map,C# 字典的结构,key是筛选器,value是筛选器下面应该放哪些文件。通过vpaths来指定:
1
2
3
4
5
6
7
8
9
10
11
12
13
14project("AssetPipeline")
files {
path.join("public/**.*"),
path.join("private/**.*"),
}
vpaths {
["Private/*"] = {
"private/**.*"
},
["Public/*"] = {
"public/**.*",
},
}
- A:筛选器这里指的是VisualStuido IDE里的源码分类文件夹,正常情况是默认生成的,但也有你想定制,或者premake自动生成的文件夹不正确的情况。做法也很简单,填充一个类似C++ map,C# 字典的结构,key是筛选器,value是筛选器下面应该放哪些文件。通过vpaths来指定:
- Q: bin和obj,还有工程文件全部暴露在根目录,怎么让他们换个位置更整洁?
- A: 分别通过targetdir和objdir来指定:
1
2
3project("AssetPipeline")
targetdir("build/bin")
objdir("build/obj")
- A: 分别通过targetdir和objdir来指定:
- Q: Debug和Release两个不同配置怎么填写?比如我想让Release也能生成pdb,让Debug也能开启简单的优化
- A:在workspace下通过filter来区分debug和release两套配置,再对应开启不同设置
1
2
3
4
5
6
7
8
9
10
11workspace("AssetPipeline")
configurations { "Debug", "Release" }
filter "configurations:Debug"
defines { "_DEBUG" }
symbols("On")
optimize("Off")
filter "configurations:Release"
defines { "NDEBUG" }
symbols("Off")
optimize("Full")
filter {}
- A:在workspace下通过filter来区分debug和release两套配置,再对应开启不同设置
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.