windows - 如何通过 premake5 向生成的 Visual Studio 项目和解决方案添加全局属性?
问题描述
我想在我的项目配置中添加两个条件属性以针对非默认 vcpkg 三元组:https ://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#with-msbuild
我的项目文件是由 premake 生成的。我该怎么办?
解决方案
您可以尝试从 Visual Studio 生成器中覆盖全局函数,类似这样...未测试...
local vs2010 = premake.vstudio.vs2010
function vcPkgOverride(prj)
-- go trough the configs and platforms and figure out which conditions to put
for _, cfg in pairs(prj.cfgs) do
local condition = vs2010.condition(cfg)
if cfg.platform == "Win32" then
vs2010.vc2010.element("VcpkgTriplet ", condition, "x86-windows-static")
else if cfg.platform == "x64" then
vs2010.vc2010.element("VcpkgTriplet ", condition, "x64-windows-static")
end
end
end
premake.override(vc2010.elements, "globals", function (oldfn, prj)
local elements = oldfn(prj)
elements = table.join(elements, {
vcPkgOverride
})
end
return elements
end)
更新
上面的代码似乎不适用于 premake5.0.0-alpha14 所以我根据文档对其进行了调整,在这里你有一个不太通用但可以工作的版本:
require('vstudio')
local vs = premake.vstudio.vc2010
local function premakeVersionComment(prj)
premake.w('<!-- Generated by Premake ' .. _PREMAKE_VERSION .. ' -->')
end
local function vcpkg(prj)
premake.w('<VcpkgTriplet>x64-windows-static</VcpkgTriplet>')
premake.w('<VcpkgEnabled>true</VcpkgEnabled>')
end
premake.override(premake.vstudio.vc2010.elements, "project", function(base, prj)
local calls = base(prj)
table.insertafter(calls, vs.xmlDeclaration, premakeVersionComment)
return calls
end)
premake.override(premake.vstudio.vc2010.elements, "globals", function(base, prj)
local calls = base(prj)
table.insertafter(calls, vs.globals, vcpkg)
return calls
end)
在你的主要 premake5.lua 脚本的开头添加它,或者找到一种从其他地方包含它的方法(我对 lua 或 premake 了解不多,我只需要解决这个问题并想向社区展示它)
推荐阅读
- c# - 如何通过属性使字典只读?
- qt - QML QtQuick。动态创建的组件不适用于绑定和基本方法
- wordpress - Gutenberg - 一种块类型中的多个 InnerBlocks
- python - 日历库中的值太多无法解压错误
- javascript - 如何重写 JavaScript 货币格式以缩写美元金额
- google-apps-script - 数据透视表按值排序
- python - 当映射到熊猫系列时,str.replace 方法在用户定义的函数中不起作用;但是,它适用于正常的函数调用。为什么?
- makefile - 文件名中的 CMake 哈希
- oracle - 只有一列的Oracle递归查询
- c - 如何在C中初始化堆中的只读内存位置?