承接 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
      7
      project("AutoMake")
      kind("Utility")

      prebuildcommands {
      "make.bat"
      }
      prebuildmessage "Making project..."
  • 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
      14
      project("AssetPipeline")
      files {
      path.join("public/**.*"),
      path.join("private/**.*"),
      }

      vpaths {
      ["Private/*"] = {
      "private/**.*"
      },
      ["Public/*"] = {
      "public/**.*",
      },
      }
  • Q: bin和obj,还有工程文件全部暴露在根目录,怎么让他们换个位置更整洁?
    • A: 分别通过targetdir和objdir来指定:
      1
      2
      3
      project("AssetPipeline")
      targetdir("build/bin")
      objdir("build/obj")
  • Q: Debug和Release两个不同配置怎么填写?比如我想让Release也能生成pdb,让Debug也能开启简单的优化
    • A:在workspace下通过filter来区分debug和release两套配置,再对应开启不同设置
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      workspace("AssetPipeline")
      configurations { "Debug", "Release" }
      filter "configurations:Debug"
      defines { "_DEBUG" }
      symbols("On")
      optimize("Off")
      filter "configurations:Release"
      defines { "NDEBUG" }
      symbols("Off")
      optimize("Full")
      filter {}