6.19 使用 Lua

  这一节描述了在 ports 系统中的 Lua 库的现状, 以及它与 ports 系统的集成。

6.19.1 介绍

  许多不同版本的 Lua 库和相关的解释器之间是相互冲突的 (它们会安装同名的文件)。 在 ports 系统中, 这一问题是通过将不同版本的文件以不同的版本号作为后缀名解决的。

  这样做最大的一个问题是, 每个程序都需要进行修改才能找到它所需要的版本。 不过, 通过将适当的参数传给编译器和连接器很容易解决这个问题。

6.19.2 选择版本

  要让您的 port 使用指定版本的 Lua, 可以定义两个变量的值 (如果只定义了其中的一个, 则另一个会使用默认值):

表 6-34. 用于选择 Lua 版本的变量

变量 说明 默认值
USE_LUA port 能够使用的 Lua 版本列表 全部可用版本
USE_LUA_NOT 与 port 不兼容的版本列表

  下面是目前 ports 系统提供的可用 Lua 版本和对应的目录:

表 6-35. 可用的 Lua 版本

版本 Port
4.0 lang/lua4
5.0 lang/lua50
5.1 lang/lua

  在 表 6-34 中的变量, 可以设置为下面的版本之一, 或用空格分隔的若干版本:

表 6-36. 指定 Lua 版本

说明 例子
一个版本 4.0
某个版本或更高版本 5.0+
不高于某个版本 5.0-
版本范围 (低版本必须在前) 5.0-5.1

  除此之外, 也有一些用来从可用版本中选择推荐版本的其它变量。 这些变量也可以设置为一组版本, 而前面的版本优先级较高。

表 6-37. 用于选择推荐 Lua 版本的变量

变量名 用于
WANT_LUA_VER port
WITH_LUA_VER 用户

例 6-9. 选择 Lua 版本

下面是一个用到 Lua 版本 5.05.1, 并默认使用 5.0 的 port 的片段。 这个默认值可以通过 WITH_LUA_VER 来另外指定。

USE_LUA=      5.0-5.1
WANT_LUA_VER= 5.0

6.19.3 组件的选择

  也有一些其它的应用, 尽管本身并不是 Lua 库, 但却与它们相关。 这些应用可以通过 LUA_COMPS 变量来指定。 可用的组件如下:

表 6-38. 可用的 Lua 组件

名字 说明 版本限制
lua 主库
tolua 用于访问 C/C++ 代码的库 4.0-5.0
ruby Ruby 绑定 4.0-5.0

注意: 还有一些其它的组件, 但这些组件是由解释器, 而不是由应用程序使用的 (也就是不被其它模块使用)。

  每个组件的依赖关系类型可以通过手工添加分隔符为冒号的后缀来指定。 如果不指定, 则会采用默认类型 (请参见 表 6-40)。 以下是可用的依赖关系类型:

表 6-39. 可用的 Lua 依赖关系类型

名字 说明
build 这个组件是联编过程所必需的, 相当于 BUILD_DEPENDS
run 在运行时需要这个组件, 相当于 RUN_DEPENDS
lib 这个组件在联编和运行时都需要, 相当于 LIB_DEPENDS

  组件的默认依赖关系类型如下:

表 6-40. 默认的 Lua 依赖关系类型

组件 依赖关系类型
lua 对于 4.0-5.0lib (动态连接) 而对于 5.1 则是 build (静态连接)
tolua build (静态连接)
ruby lib (动态连接)

例 6-10. 选择 Lua 组件

下面是一个使用了 Lua 版本 4.0 及其 Ruby 绑定的 port 片段。

USE_LUA=      4.0
LUA_COMPS=    lua ruby

6.19.4 检测系统中已安装的版本

  要检测系统中已安装的版本, 您必须定义 WANT_LUA。 如果没有将其设定为具体的版本, 则组件会包含版本后缀。 在检测之后, HAVE_LUA 变量将设为检测到的版本。

例 6-11. 检测已安装的 Lua 版本和组件

下面是一个如果系统中有安装 Lua 或选择了选项时使用它的 port 片段。

WANT_LUA=       yes

.include <bsd.port.pre.mk>

.if defined(WITH_LUA5) || ${HAVE_LUA:Mlua-5.[01]} != ""
USE_LUA=        5.0-5.1
CONFIGURE_ARGS+=--enable-lua5
.endif

下面的这段 port 在系统中已经有安装, 或用户选择了 toluaLua 支持时加以安装, 版本均选择 4.0

USE_LUA=        4.0
LUA_COMPS=      lua
WANT_LUA=       4.0

.include <bsd.port.pre.mk>

.if defined(WITH_TOLUA) || ${HAVE_LUA:Mtolua} != ""
LUA_COMPS+=     tolua
CONFIGURE_ARGS+=--enable-tolua
.endif

6.19.5 定义的变量

  在 port 中可以使用下列变量 (在定义了 表 6-34 中至少一个变量之后)。

表 6-41. 为用到 Lua 的 port 定义的变量

变量名 说明
LUA_VER 将要使用的 Lua 版本。 (例如, 5.1)
LUA_VER_SH Lua 动态连接库的主版本 (例如, 1)
LUA_VER_STR 不带点的 Lua 版本 (例如, 51)
LUA_PREFIX 安装 Lua (及其组件) 使用的后缀
LUA_SUBDIR ${PREFIX}/bin${PREFIX}/share${PREFIX}/lib 中用于安装 Lua 的子目录
LUA_INCDIR 用以安装 Luatolua 头文件的目录
LUA_LIBDIR 用以安装 Luatolua 库文件的目录
LUA_MODLIBDIR 用以安装 Lua 模块动态连接库 (.so) 的目录
LUA_MODSHAREDIR 用以安装 Lua 模块 (.lua) 的目录
LUA_PKGNAMEPREFIX Lua 模块包的后缀名
LUA_CMD Lua 解释器的路径
LUAC_CMD Lua 编译器的路径
TOLUA_CMD tolua 程序的路径

例 6-12. 告诉 port 到什么地方去找 Lua

下面的 port 片段展示了如何告诉使用的 configure 脚本去什么地方查找 Lua 的头文件和库文件。

USE_LUA=        4.0
GNU_CONFIGURE=  yes
CONFIGURE_ENV=  CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"

6.19.6 在 bsd.port.pre.mk 时进行处理

  如果您需要在使用引用 bsd.port.pre.mk 之后就得到变量, 以便将其用于执行一些命令, 需要定义 LUA_PREMK

重要: 如果您定义了 LUA_PREMK, 则在您引用 bsd.port.pre.mk 之后, 即使修改了 Lua port 变量, 版本和依赖关系也都不会随之发生变化了。

例 6-13. 在命令中使用 Lua 变量

下面的片段展示了如何利用 LUA_PREMK, 并运行 Lua 解释器得到完整的版本串, 将其赋值给一个变量, 并传递给程序。

USE_LUA=        5.0
LUA_PREMK=      yes

.include <bsd.port.pre.mk>

.if exists(${LUA_CMD})
VER_STR!=       ${LUA_CMD} -v

CFLAGS+=        -DLUA_VERSION_STRING="${VER_STR}"
.endif

注意: 在 target 中的 Lua 变量可以在命令中安全的使用, 而无需使用 LUA_PREMK

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <[email protected]>。
关于此文档的任何问题, 请致函 <[email protected]>。