IrisBuild: 一个跨平台跨语言的构建系统

背景

现代的游戏引擎都支持多平台,既然要支持多平台的话,自定义的构建系统在引擎工具链上就必不可少了。比如Unity需要同时支持C#,C++语言的编译,由此引入了Jamplus以及后来自己基于Jam和C#改造的UnityBuildSystem构建系统,Unreal则基于自己的需求(UHT生成)开发了UBTCryEngine则是基于CMake修改了一套构建系统。

游戏引擎涉及的编程语言也会比较多,一般会用**C++/C/ObjC/ObjC++**写核心代码,其他语言写工具链和框架。

Kaleido3D 是一个笔者业余时间写的跨平台的3D图形库,由于要同时支持Android、iOS平台,开发过程中不停的电脑切换容易打断工作,影响开发效率,所以突发奇想想到了在Windows上开发iOS程序,那也需要在Windows上构建iOS代码,因此开了个新坑:XBuild


现状

现有跨平台构建工具主要有:

  • CMake (市场份额最大)
  • Premake
  • GN (Chrome浏览器)
  • GYP (Chrome浏览器)
  • Meson(Linux上用的比较多)

如何在Windows上开发iOS程序?

iOS程序的构建主要基于Clang-LLVM体系,由于这套CFamily的工具链开源,因此网友开发了iOS Build Environment套件用于在Windows系统构建iOS应用(虽然违反了苹果的规定)。

说到开发,少不了一个好用的IDE用于代码编辑。这里考虑使用VSCode用于Windows下ObjC的代码编辑,VSCode支持微软开发的Language Server Protocol提供的代码提示补全高亮的协议,而相应的LLVM下也正在实现基于LSP的ClangD用于跨平台跨编辑器的代码编辑。


IrisBuild的需求

笔者曾有幸参与UE4的引擎优化开发,在开发过程中尝尽了漫长的编译时间等待以及资源打包带来的痛苦,为此如何提高引擎/游戏开发和迭代效率成为了XBuild的目标。

  • 支持分布式虚拟进程,类似Incredibuild
  • iOS、Android同主机平台构建
  • Visual Studio & Visual Studio Code & XCode 项目文件支持
  • 支持Rust、C++/C/ObjC/ObjC++、C#、Java、HLSL/DXIL、Metal、SPIRV编译

经过几个月的开发,IrisBuild套件有了雏形,其中借鉴了Google家的Ninja以及GN的特性,在此基础上简化了不少功能,形成了现在的语法。

构建前端 IrisBuild

cproj("kCore") {
    type = "shared_lib"
    srcs = [ 
        "Base/**.h",
        "Base/*.cpp",
        "XPlatform/**.h",
        "XPlatform/**.cpp"
    ]
    private = {
        defines = [ "LIB_BUILD=1", "BUILD_SHARED_LIB=1" ]
    }
    match(${target_os}) {
        "windows" => { 
            defines = ["K3DPLATFORM_OS_WIN=1","K3D_USE_SSE=1"] 
            srcs += "../Platform/Microsoft/Win32/**.cpp"
        }
        "android" => {
            defines = ["K3DPLATFORM_OS_ANDROID=1", "K3D_USE_NEON=1"] 
            srcs += "../Platform/Android/cpp/**.cpp"
        }
        "ios" => {
            defines = ["K3DPLATFORM_OS_IOS=1", "K3D_USE_NEON=1"] 
            srcs += "../Platform/Apple/iOS/**.mm"
            srcs += "../Platform/Apple/CpuUsage.mm"
        }
        "macos" | "linux" => {
            defines = ["K3DPLATFORM_OS_MAC=1", "K3D_USE_SSE=1"] 
            srcs += "../Platform/Apple/MacOS/**.cpp"
            srcs += "../Platform/Apple/CpuUsage.mm"
        }
        "linux" => {
            defines = ["K3DPLATFORM_OS_LINUX=1", "K3D_USE_SSE=1"] 
            srcs += "../Platform/Linux/**.cpp"
        }
    }
    srcs = list_files(srcs)
    inc_dirs = [ "." ]
    on_init = () {
        url = "https://ci.appveyor.com/api/projects/tomicyo/third-party-clibs/artifacts/build/third_party_clibs_windows_shared.zip"
        download_and_extract(url, "${build_dir}/third_party")
        glslang_url = "https://ci.appveyor.com/api/projects/tomicyo/glslang/artifacts/build/install/glslang-x64-Release.zip?job=Configuration%3A+Release"
        download_and_extract(glslang_url, "${build_dir}/third_party")
    }
}

这是简单的一个示例工程脚本,相比GN的语法描述更清晰和简洁,IrisBuild同样提供不少内置函数。

他相比于GN以及其他工具对跨平台开发的支持更方便和完善。
IrisBuild: 一个跨平台跨语言的构建系统_第1张图片

生成VS工程目录
IrisBuild: 一个跨平台跨语言的构建系统_第2张图片

Android Native 代码开发
IrisBuild: 一个跨平台跨语言的构建系统_第3张图片

你可能感兴趣的:(游戏引擎工具开发)