如何在 premake5 中获取当前状态?
How to get current state in premake5?
在我的 Premake5 脚本中,我正在实现一个函数,该函数将 return 一个 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
但它没有记录并且似乎不是 "the way it should be done",因此可能会在未来的预制版本中停止工作。
我能做到:
name = "boost_" .. name
...
filter "configurations:Debug*"
links { name .. "-gd" }
filter "configurations:Release*"
links { name }
但是如果名称包含多个只能通过 "filter".
访问的变量,这种方法就会产生问题
是否有可能以标准(即非 hacky)方式访问当前预制作状态?还是后者(我猜更具声明性)是首选方式?
为清楚起见编辑:
主要问题是:是否可以使用premake的状态(例如当前配置名称)"in lua"(例如在if
表达式中)? IE。我要输入什么 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
下的字符串连接,但这是唯一的方法吗?如果这是最好的方法,那为什么?
Tokens 是应用这种逻辑的方法。
filter "configurations:Debug*"
links { "boost_%{cfg.name}-gd" }
关于您的评论:
I want a string containing the current configuration name, or the current project's output file path etc so that I could then call a lua function with it (e.g. os.copyfile)
这是不可能的,因为在您的脚本 运行 时没有 "current" 配置这样的东西。这只有在您的脚本完成并生成目标文件后才有可能。
我将尝试组合一个示例,但要复制文件,您需要查看 postbuildcommands and command tokens。
在我的 Premake5 脚本中,我正在实现一个函数,该函数将 return 一个 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
但它没有记录并且似乎不是 "the way it should be done",因此可能会在未来的预制版本中停止工作。
我能做到:
name = "boost_" .. name
...
filter "configurations:Debug*"
links { name .. "-gd" }
filter "configurations:Release*"
links { name }
但是如果名称包含多个只能通过 "filter".
访问的变量,这种方法就会产生问题是否有可能以标准(即非 hacky)方式访问当前预制作状态?还是后者(我猜更具声明性)是首选方式?
为清楚起见编辑:
主要问题是:是否可以使用premake的状态(例如当前配置名称)"in lua"(例如在
if
表达式中)? IE。我要输入什么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
下的字符串连接,但这是唯一的方法吗?如果这是最好的方法,那为什么?
Tokens 是应用这种逻辑的方法。
filter "configurations:Debug*"
links { "boost_%{cfg.name}-gd" }
关于您的评论:
I want a string containing the current configuration name, or the current project's output file path etc so that I could then call a lua function with it (e.g. os.copyfile)
这是不可能的,因为在您的脚本 运行 时没有 "current" 配置这样的东西。这只有在您的脚本完成并生成目标文件后才有可能。
我将尝试组合一个示例,但要复制文件,您需要查看 postbuildcommands and command tokens。