背景
现代的游戏引擎都支持多平台,既然要支持多平台的话,自定义的构建系统在引擎工具链上就必不可少了。比如Unity需要同时支持C#,C++语言的编译,由此引入了Jamplus以及后来自己基于Jam和C#改造的UnityBuildSystem构建系统,Unreal则基于自己的需求(UHT生成)开发了UBT;CryEngine则是基于CMake修改了一套构建系统。
游戏引擎涉及的编程语言也会比较多,一般会用C++/C/ObjC/ObjC++写核心代码,其他语言写工具链和框架。
Kaleido3D 是一个笔者业余时间写的跨平台的3D图形库,由于要同时支持Android、iOS平台,开发过程中不停的电脑切换容易打断工作,影响开发效率,所以突发奇想想到了在Windows上开发iOS程序,那也需要在Windows上构建iOS代码,因此开了个新坑:XBuild。
现状
现有跨平台构建工具主要有:
- CMake (市场份额最大)
- Premake
- GN (Chrome浏览器)
- GYP (Chrome浏览器)
如何在Windows上开发iOS程序?
iOS程序的构建主要基于Clang-LLVM体系,由于这套CFamily的工具链开源,因此网友开发了iOS Build Environment套件用于在Windows系统构建iOS应用(虽然违反了苹果的规定)。
说到开发,少不了一个好用的IDE用于代码编辑。这里考虑使用VSCode用于Windows下ObjC的代码编辑,VSCode支持微软开发的Language Server Protocol提供的代码提示补全高亮的协议,而相应的LLVM下也正在实现基于LSP的ClangD用于跨平台跨编辑器的代码编辑。
XBuild的需求
笔者曾有幸参与UE4的引擎优化开发,在开发过程中尝尽了漫长的编译时间等待以及资源打包带来的痛苦,为此如何提高引擎/游戏开发和迭代效率成为了XBuild的目标。
- 支持分布式虚拟进程,类似Incredibuild
- iOS、Android同主机平台构建
- Visual Studio & Visual Studio Code & XCode 项目文件支持
- 支持Rust、C++/C/ObjC/ObjC++、C#、Java、HLSL/DXIL、Metal、SPIRV编译
经过几个月的开发,Xbuild套件有了雏形,其中借鉴了Google家的Ninja以及GN的特性,在此基础上简化了不少功能,形成了现在的语法。
构建前端 XBGN (GN, Xbuild Version)
solution("IBLToolchain") {
cproj("RuntimeIBL") {
type = "shared_lib"
srcs = [
"src/**.h",
"src/**.cpp",
"src/**.c"
]
srcs = list_files(srcs)
inc_dirs = ["src"]
defines = ["GLEW_BUILD=1", "BUILD_LIB=1"]
link_libs = ["opengl32.lib"]
on_prebuild = () {
srcs += file_to_bytes(["src/cubemap_filter.vs","src/cubemap_filter.fs"])
}
dest_dir = "../UnityProject/Assets/Plugins/X86"
}
cproj("test") {
type = "executable"
srcs = ["tests/test.cpp"]
inc_dirs = [ "src" ]
link_targets = [ "RuntimeIBL" ]
}
}
这是简单的一个示例工程脚本,相比GN的语法描述更清晰和简洁,XBGN同样提供不少内置函数。
他相比于GN以及其他工具对跨平台开发的支持更方便和完善。
生成VS工程目录
Android Native 代码开发