c++ 如何在premake中为每个项目设置多个目标?

dtcbnfnu  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(376)

我正在尝试在premake中设置多个目标。目前,我专注于Xcode,但希望同样的想法也适用于MS Visual Studio。
在我的工作区中,我有一个库,当前有一个以项目名称命名的构建目标(我们称之为“MyLibrary”)。然后,我在工作区中有其他项目使用这个库。目前,我只支持工作区中所有项目的Debug配置,但我正在尝试为我的库添加两个目标-- Release和Test。因此,我希望有以下目标:

  • MyLibrary-调试
  • MyLibrary发布
  • MyLibrary-Test

如果我可以让库项目输出两个目标,我可以告诉我的项目基于配置使用正确的目标:

project "MyLibrary"
  --- Create multiple targets

project "DemoProject"
   --- stuff
  filter { "configurations:Debug" }
    links { "MyLibrary-Debug" }
  filter { "configurations:Release" }
    links { "MyLibrary-Release" }

这是我试图解决的一个问题。第二个是测试。目前,我有一个单独的单元测试项目。这些测试使用库并运行测试以查看库是否工作。这工作得很好,但我不能为我的图书馆生成覆盖率报告。这样的测试更适合于E2 E测试,而不是单元测试。所以,我基本上需要两个项目配置,除了一些小的变化,还包括测试和测试库:

project "MyLibrary"
  kind "StaticLib"
  files {
    "engine/src/**.cpp",
    "engine/src/**.h",
  }

  links { ... }
  -- other config in library

project "MyLibrary-Test"
  kind "ConsoleApp"
  files {
    "engine/src/**.cpp",
    "engine/src/**.h",
    "engine/tests/**.h",
    "engine/tests/**.cpp",
  }

  links { "gtest", "gtest_main", "gmock", ... }
  -- other config in library

对于多个目标,我可以为目标分配不同的配置,并执行以下操作:

project "MyLibrary"
  kind "StaticLib"
  files {
    "engine/src/**.cpp",
    "engine/src/**.h",
  }

  links { ... }
  
  filter { "configurations:Test" }
    kind "ConsoleApp"
    files {
      "engine/tests/**.cpp",
      "engine/tests/**.h"
    }

    links { "gtest", "gtest_main", "gmock" }

  -- Set different targets somehow, where each target
  -- sets configuration value

有没有可能在premake中做到这一点,特别是在一种不特定于Xcode的方式下?例如,如果我使用gmake,目标会创建不同的二进制文件/库。

kjthegm6

kjthegm61#

您只需要使用不同的project来拥有不同的target
以下是我对premake的理解和使用方法,目前为止只使用gmake2。这可能不是预期的方式,但我认为它可以按照您想要的方式组织输出。
workspace级别上必须至少有一个configuration
我们可以在工作区中有几个project,每个project都有自己的二进制targetname。然后选择使用make targetname构建的目标。
在同一个project中,我们可以使用filter { "configuration:confname" }以多种方式配置目标(例如发布和调试)。然后使用make config=confname构建。我没有测试链接,但我想你可以把这个过滤器。
因此,要构建具有特定配置的特定目标:

make config=confname projectname

不指定配置将使用第一个配置,而不指定项目将生成所有目标。
我承认整个方法有点笨拙,因为我们必须在每个项目中重复配置过滤器,即使它们在任何地方都是相同的。
这里有一个小例子。

-- premake5.lua
workspace "Project Name"

    configurations { "debug", "release" }

    kind        "ConsoleApp"
    objdir      "../build/obj"
    language    "C++"
    cppdialect  "C++20"
    location    "../"
    targetdir   "../bin"
    includedirs { "../include" }

    project "program_name"
        targetname "program_name"
        files { "../src/main.cpp" }

        filter "configurations:debug"
            symbols   "On"
            optimize  "Off"

        filter "configurations:release"
            defines   { "NDEBUG" }
            symbols   "Off"
            optimize  "On"

    project "test"
        targetname "test"
        files { "../src/test/test-program.cpp" }

        filter "configurations:debug"
            symbols   "On"
            optimize  "Off"

        filter "configurations:release"
            defines   { "NDEBUG" }
            symbols   "Off"
            optimize  "On"

相关问题