Premake 项目构建/配置脚本:如何让用户将自己的路径添加到一个包含库路径(libdirs)和包含路径(includedirs)的数组中?

我有一个简单的控制台应用程序项目,用于使用跨平台库将直播视频流式传输到某些TCP服务器。我已经将它从Windows手动移植到Linux和Mac OS X。因此,我现在有3个使用相同代码的项目,每个项目都是手动创建并经过测试的。现在我正在尝试创建一个premake lua项目创建文件,以自动化更新项目文件的过程。

我开始创建一个lua文件。

在我的premake lua构建文件中,我有一个lib链接数组,其中包含我项目所需的lib链接数组。

其中一些有点重复,有些则不是(因为例如在Windows上有“openal32”(即使在Windows 7的64位版本上也是如此),而Linux上有更简单的名称“openal”,Mac OS X上是“OpenAL.framework”(它是在mac os中包括openAL的唯一选项)。

我设置了一个linkdirs属性-适用于所有系统

libdirs {
"/opt/local/lib",
"/System/Libarary/Frameworks",
"/Library/Frameworks",
"/usr/lib",
"/usr/local/lib" }

链接到那些目录可能适用于Mac OS X(因为我们使用Mac Ports,默认安装到/opt/local/lib)和Linux(我们大多数使用应用程序-获取模拟器,自动将所有内容安装到usr/lib中,并有时安装到/usr/local/lib)。但在Windows上,你永远不知道ffmpeg在哪里或boost安装在哪里(可能每个程序员都有自己的想法,以保留Windows的Libs和Headers …),因此我们需要从premake中获得一件简单的事情:

操作以添加用户定义的库目录,这些目录将包含在libdirs数组中,并且对于includedirs数组也是如此。它应该能够添加多个目录。

如何启用这样的功能?

我尝试创建一个“基于选项的系统”,例如

newoption {
trigger = “libsPath”,
value = “路径”,
description =“选择特定目录进行通用lib搜索”
}
如果没有_OPTIONS [“libsPath”],则
_OPTIONS [“libsPath”] = NULL
end

libdirs {
"/opt/local/lib",
"/System/Libarary/Frameworks",
"/Library/Frameworks",
"/usr/lib",
"/usr/local/lib",
_OPTIONS [“libsPath”]
}

但它似乎在windows上无法正常工作……我该怎么办?

原文链接 https://stackoverflow.com/questions/5236733

点赞
stackoverflow用户79566
stackoverflow用户79566

当您想让用户指定 include 或 library 目录时,其中一个最简单的方法是使用环境变量。当您的脚本运行时,它们可以查找名为 EXTRA_LIB_PATHSEXTRA_INCLUDE_PATHS(或您想要称之为的任何名称)的环境变量,并将其中列出的路径添加到您提到的预定义路径列表中。

Windows、Linux 和 OSX 都有环境变量的概念,但它们并不使用完全相同的格式。Windows 环境变量中的目录路径列表通常由分号分隔,而 Linux 通常使用冒号。您需要确保解析环境变量的代码可以检测到当前平台并使用适当的方法提取数据。

另一个可能性是将目录路径作为命令行选项传递给您的 premake 脚本(使用类似于 premake.lua -L/path/to/lib -I/my/include/path -L/another/lib/path 的语法)。这种方法的缺点是命令行可能会变得相当长,而某些控制台可能有 CLI 命令长度的限制。如果您需要使用超过一些额外路径,我建议使用环境变量而不是 CLI 参数。

2011-03-08 19:02:02
stackoverflow用户93921
stackoverflow用户93921

你不需要这一部分:

if not _OPTIONS["libsPath"] then
   _OPTIONS["libsPath"] = NULL
end

如果它未设置,它已经是 nil(Lua 中相当于 NULL)了。否则,这看起来很不错,对我而言也可以正常工作。

你可能可以进行一个改进:将该参数转换为接受路径用分隔符分隔的列表,这样如果有必要的话,用户就可以提供多个路径。如果你像这样调用脚本,使用分号分隔路径:

C:\> premake4 /libsPath=C:\Code\Libs;C:\Code\MoreLibs vs2010

你可以像这样添加到库搜索路径中:

-- 将其分割
libdirs { string.explode(_OPTIONS["libsPath"], ";") }

未经测试,但应该可以正常工作。希望这有所帮助!

2011-03-11 13:29:07