Vcpkg 的预制覆盖
Premake override for Vcpkg
我希望能够创建自定义覆盖以根据我们当前的配置添加 VcpkgConfiguration
属性。
我们有一个使用 Premake 和 vcpkg 的 C++ 项目。我们发现 vcpkg 与包含其自己版本的类似库的其他项目冲突,因此我们无法使用它提供的全局集成。相反,我们将它作为一个子模块添加到我们的项目中,并 link 通过带有自定义覆盖的 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 不会 link 正确。为了解决这个问题,我们修改了 vcpkg.targets
文件以识别我们在本地分支中的配置。这并不理想,因为它迫使我们将我们的分支从 vcpkg
变基以更新它,并且如果该文件在他们的 repo 中被修改,则可能会发生冲突。
目标文件允许您在包含目标之前设置 VcpkgConfiguration
属性,这是我们想要做的。
基本上我们希望能够像这样通过过滤器调用命令:
filter {"configurations:<SomeConfiguration>"}
VcpkgConfig "Debug"
这会在 属性组
中添加
<VcpkgConfiguration>Debug</VcpkgConfiguration>
我们怎样才能做到这一点?
问题似乎是 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
未测试。
这行得通吗?
我希望能够创建自定义覆盖以根据我们当前的配置添加 VcpkgConfiguration
属性。
我们有一个使用 Premake 和 vcpkg 的 C++ 项目。我们发现 vcpkg 与包含其自己版本的类似库的其他项目冲突,因此我们无法使用它提供的全局集成。相反,我们将它作为一个子模块添加到我们的项目中,并 link 通过带有自定义覆盖的 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 不会 link 正确。为了解决这个问题,我们修改了 vcpkg.targets
文件以识别我们在本地分支中的配置。这并不理想,因为它迫使我们将我们的分支从 vcpkg
变基以更新它,并且如果该文件在他们的 repo 中被修改,则可能会发生冲突。
目标文件允许您在包含目标之前设置 VcpkgConfiguration
属性,这是我们想要做的。
基本上我们希望能够像这样通过过滤器调用命令:
filter {"configurations:<SomeConfiguration>"}
VcpkgConfig "Debug"
这会在 属性组
中添加<VcpkgConfiguration>Debug</VcpkgConfiguration>
我们怎样才能做到这一点?
问题似乎是 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
未测试。 这行得通吗?