命令行参数
Premake提供了使用newaction和newoption函数从项目脚本中定义和处理新命令行参数的功能。
动作和选项
Premake可以识别两种类型的参数:操作和选项。
动作指示Premake在任何给定的运行中应执行的操作。 例如,vs2013操作指示应生成Visual Studio 2013项目文件。 清除操作将导致所有生成的文件被删除。 一次只能指定一个动作。
一个选项可以修改操作的行为。 例如,dotnet选项用于更改在生成的文件中使用的.NET编译器集。 选项可以接受--dotnet = mono之类的值,也可以作为--with-opengl之类的标志。
在脚本中,您可以使用_ACTION 全局变量(字符串值)来标识当前操作。 您可以使用 _OPTIONS 表检查选项,该表包含键/值对列表。 键是选项标识符(“ dotnet”),它引用命令行值(“ mono”)或无值选项的空字符串。
-- delete a file if the clean action is running
if _ACTION == "clean" then
-- do something
end
-- use an option value in a configuration
targetdir ( _OPTIONS["outdir"] or "out" )
创建新选项
使用 newoption 函数创建新的命令行选项,并传递一个完整描述该选项的表。最好用一些例子来说明。
这是一个旨在强制在3D应用程序中使用OpenGL的选项。它只是一个简单的标志,没有任何值。
newoption {
trigger = "with-opengl",
description = "Force the use of OpenGL for rendering, regardless of platform"
}
注意每个键值对之后的逗号;这是表的Lua语法所必需的。一旦添加到脚本中,该选项将出现在帮助文本中,您可以将触发器用作配置块中的关键字。
configuration "with-opengl"
links { "opengldrv" }
configuration "not with-opengl"
links { "direct3ddrv" }
下一个示例显示了具有一组固定的允许值的选项。像上面的示例一样,它旨在允许用户指定3D API。
newoption {
trigger = "gfxapi",
value = "API",
description = "Choose a particular 3D API for rendering",
allowed = {
{ "opengl", "OpenGL" },
{ "direct3d", "Direct3D (Windows only)" },
{ "software", "Software Renderer" }
}
}
和以前一样,此新选项将与每个允许值的描述一起集成到帮助文本中。 Premake将在启动时检查选项值,并在无效值上引发错误。 值字段出现在帮助文本中,旨在为用户提供有关所需值类型的线索。 在这种情况下,帮助文本将如下所示:
--gfxapi=API Choose a particular 3D API for rendering; one of:
opengl OpenGL
direct3d Direct3D (Windows only)
software Software Renderer
与上面的示例不同,现在您可以在配置块中将值用作关键字。
configuration "opengl"
links { "opengldrv" }
configuration "direct3d"
links { "direct3ddrv" }
configuration "software"
links { "softwaredrv" }
否则您可能会更聪明。
links { _OPTIONS["gfxapi"] .. "drv" }
在此示例中,对于未指定选项的情况,您还希望提供默认行为。您可以在脚本中的任何位置放置这样的代码。
if not _OPTIONS["gfxapi"] then
_OPTIONS["gfxapi"] = "opengl"
end
作为选项的最后一个示例,您可能希望指定一个接受不受限制的值的选项,例如输出路径。只需将其排除在允许值列表之外即可。
newoption {
trigger = "outdir",
value = "path",
description = "Output directory for the compiled executable"
}
创建新动作
动作的定义方式与选项基本相同,可以如此简单:
newaction {
trigger = "install",
description = "Install the software",
execute = function ()
-- copy files, etc. here
end
}
触发动作时要执行的实际代码应放在execute()函数中。
这是简单的版本,非常适合不需要访问特定项目信息的一次性操作。有关编写更完整动作的教程,请参阅添加新动作。