在我的Premake5脚本中,我正在实现一个函数,该函数将根据当前设置返回一个boost库的名称(如果是调试配置,你将-gd
,如果你是-mt
想要多线程等等)。在我第一次尝试时我得到了这个:
name = "boost_" .. name
...
filter "configurations:Debug*"
name = name .. "-gd"
...
links { name }
显然不正确:-gd
将附加到名称,无论我们是否正在评估调试配置。类似于:
name = "boost_" .. name
...
if (CONFIGURATION.MATCHES_FILTER("Debug*"))
name = name .. "-gd"
...
links { name }
会使它工作,但我找不到轻松访问当前配置的方法。有configuration().current
,但它没有记录,似乎不是“它应该做的方式”,因此可能会在未来的预制版本中停止工作。
我能做到:
name = "boost_" .. name
...
filter "configurations:Debug*"
links { name .. "-gd" }
filter "configurations:Release*"
links { name }
但是如果名称可以包含只能通过“过滤器”访问的多个变量,这种方法会产生问题。
是否可以以标准(即非hacky)方式访问当前的预制状态?或者后者(更具声明性,我猜)是首选方式?
编辑清晰度:
主要问题是:是否可以在lua中使用预制状态(例如当前配置名称)(例如在if
表达式中)?即我将EXPRESSION_HERE
用什么来使下面的代码工作:
if (EXPRESSION_HERE) then
print("Executed only in Debug* configurations");
end
理由:
Boost库的命名方式不同,具体取决于它们的构建配置。另外,它们在windows和linux下有不同的名称。
boost_atomic-vc141-mt-1_64.lib
是Boost Atomic,多线程使用Boost 1.64 dll .lib
伴侣的Visual Studio 1.41工具集构建,libboost_prg_exec_monitor-vc141-mt-gd-1_64.lib
是Boost PrgExecMonitor,具有使用Boost 1.64静态库中的Visual Studio 1.41工具集构建的多线程和调试符号,libboostt_prg_exec_monitor-mt-gd.lib
与Linux(AFAIR)我觉得将最终的库名称构造为在特定情况下添加到名称的一系列if
是很自然的(例如,如果我们想要调试符号,则添加-gd
)。我知道这可以使用令牌和filter
下的字符串连接,但这是唯一的方法吗?如果这是最好的方式,为什么呢?
答案 0 :(得分:2)
Tokens是应用这种逻辑的方法。
filter "configurations:Debug*"
links { "boost_%{cfg.name}-gd" }
关于你的评论:
我想要一个包含当前配置名称的字符串,或者当前项目的输出文件路径等,以便我可以用它调用lua函数(例如os.copyfile)
这是不可能的,因为在运行脚本时不存在“当前”配置。只有在脚本完成并生成目标文件后才能实现。
我会尝试整理一个示例,但要复制您要查看postbuildcommands和command tokens的文件。