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

时间:2011-03-08 18:32:00

标签: cross-platform lua makefile premake

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

我开始创建一个lua文件

我的premake lua构建文件中有一系列lib链接我的项目需要一系列lib链接。

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

我有一个linkdirs属性集 - 一个适用于所有系统

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

指向dirs的链接可能适用于Mac OS X(因为我们使用的Mac端口默认安装到/opt/local/lib)和Linux(我们主要使用app-get模拟器自动安装到{{1}有时进入usr/lib)。但是在windows上,你永远不知道ffmpeg在哪里或者安装了boost(可能每个程序员都有自己的想法在哪里保存windows Libs和Headers ......)所以我们需要一个简单的事情来预制:

添加将包含在/usr/local/lib数组中的用户定义的librarys directorys以及libdirs数组的相同内容的操作。它应该能够添加多个目录。

如何启用此类功能?

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

includedirs

但似乎不能在Windows上工作......我该怎么办?

2 个答案:

答案 0 :(得分:4)

你不需要这个位:

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

如果未设置,它已经是nil(相当于Lua中的NULL)。否则,这看起来不错,对我来说很好。

您可能做出的一项改进:将参数转换为接受分隔的路径列表,以便您的用户可以在必要时提供多个。因此,如果您使用分号分隔的路径调用您的脚本:

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

您可以将它添加到库搜索路径中,如下所示:

-- Split it up
libdirs { string.explode(_OPTIONS["libsPath"], ";") }

未经测试,但应该有效。希望有所帮助!

答案 1 :(得分:0)

当您希望用户能够指定包含或库目录时,最简单的方法之一是使用环境变量。当您的脚本运行时,他们可以查找名为EXTRA_LIB_PATHSEXTRA_INCLUDE_PATHS的环境变量(或您想要调用的任何内容),并将其中列出的路径添加到您提到的预定义路径列表中。

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

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