Vcpkg的预制作覆盖

时间:2019-07-05 18:03:00

标签: premake

我希望能够创建一个自定义替代,以根据我们当前的配置添加一个VcpkgConfiguration属性。

我们有一个使用Premake和vcpkg的C ++项目。我们发现vcpkg与包含其自己的相似库版本的其他项目冲突,因此我们无法使用其提供的全局集成。相反,我们将其作为子模块添加到我们的项目中,并通过带有自定义覆盖的premake进行链接:

p.override(p.vstudio.vc2010, "importExtensionTargets", function(base, prj)
      p.push('<ImportGroup Label="ExtensionTargets">')
      p.callArray(p.vstudio.vc2010.elements.importExtensionTargets, prj)
      p.pop('</ImportGroup>')
      p.push('<ImportGroup Label="ExtensionTargets">')
      p.w('<Import Project="$(SolutionDir)External/vcpkg/scripts/buildsystems/msbuild/vcpkg.targets"/>')
      p.pop('</ImportGroup>')
   end)

不幸的是,我们在项目中没有使用常规的“ Debug”或“ Release”配置,因此默认情况下vcpkg无法正确链接。为了解决该问题,我们修改了vcpkg.targets文件以识别本地分支中的配置。这是不理想的,因为它迫使我们将分支vcpkg重新建立基础以进行更新,并且如果在其存储库中修改了该文件,则有可能发生冲突。

目标文件允许您在包含目标之前设置VcpkgConfiguration属性,这是我们想要做的。

基本上,我们希望能够通过这样的过滤器来调用命令:

filter {"configurations:<SomeConfiguration>"}
    VcpkgConfig "Debug"

将其添加到属性组中

<VcpkgConfiguration>Debug</VcpkgConfiguration>

我们如何做到这一点?

1 个答案:

答案 0 :(得分:0)

问题似乎是importExtensionTargets是针对每个项目的,但是您希望针对每个配置。

您可以尝试注册关键字

api.register {
      name= "VcpkgConfig",
      scope = "config",
      kind = "string",
    }

然后在您的自定义函数中

-- loop over all configurations 
for _, cfgName in ipairs(prj.configurations) do
     -- find config
    local cfg = project.findClosestMatch(prj, cfgName)

    if cfg.VcpkgConfig then

      p.push('<ImportGroup Label="ExtensionTargets">')
      p.push('<VcpkgConfiguration>'.. cfg.VcpkgConfig .. '</VcpkgConfiguration>')
      p.w('<Import Project="$(SolutionDir)External/vcpkg/scripts/buildsystems/msbuild/vcpkg.targets"/>')
      p.pop('</ImportGroup>')

    end

未经测试。 这行得通吗?