这一节描述了在 ports 系统中的 Lua 库的现状, 以及它与 ports 系统的集成。
许多不同版本的 Lua 库和相关的解释器之间是相互冲突的 (它们会安装同名的文件)。 在 ports 系统中, 这一问题是通过将不同版本的文件以不同的版本号作为后缀名解决的。
这样做最大的一个问题是, 每个程序都需要进行修改才能找到它所需要的版本。 不过, 通过将适当的参数传给编译器和连接器很容易解决这个问题。
要让您的 port 使用指定版本的 Lua, 可以定义两个变量的值 (如果只定义了其中的一个, 则另一个会使用默认值):
下面是目前 ports 系统提供的可用 Lua 版本和对应的目录:
在 表 6-34 中的变量, 可以设置为下面的版本之一, 或用空格分隔的若干版本:
除此之外, 也有一些用来从可用版本中选择推荐版本的其它变量。 这些变量也可以设置为一组版本, 而前面的版本优先级较高。
也有一些其它的应用, 尽管本身并不是 Lua 库, 但却与它们相关。 这些应用可以通过 LUA_COMPS 变量来指定。 可用的组件如下:
注意: 还有一些其它的组件, 但这些组件是由解释器, 而不是由应用程序使用的 (也就是不被其它模块使用)。
每个组件的依赖关系类型可以通过手工添加分隔符为冒号的后缀来指定。 如果不指定, 则会采用默认类型 (请参见 表 6-40)。 以下是可用的依赖关系类型:
表 6-39. 可用的 Lua 依赖关系类型
名字 | 说明 |
---|---|
build | 这个组件是联编过程所必需的, 相当于 BUILD_DEPENDS |
run | 在运行时需要这个组件, 相当于 RUN_DEPENDS |
lib | 这个组件在联编和运行时都需要, 相当于 LIB_DEPENDS |
组件的默认依赖关系类型如下:
要检测系统中已安装的版本, 您必须定义 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 在系统中已经有安装, 或用户选择了 tolua 和 Lua 支持时加以安装, 版本均选择 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
在 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 | 用以安装 Lua 和 tolua 头文件的目录 |
LUA_LIBDIR | 用以安装 Lua 和 tolua 库文件的目录 |
LUA_MODLIBDIR | 用以安装 Lua 模块动态连接库 (.so) 的目录 |
LUA_MODSHAREDIR | 用以安装 Lua 模块 (.lua) 的目录 |
LUA_PKGNAMEPREFIX | Lua 模块包的后缀名 |
LUA_CMD | 到 Lua 解释器的路径 |
LUAC_CMD | 到 Lua 编译器的路径 |
TOLUA_CMD | 到 tolua 程序的路径 |
如果您需要在使用引用 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。