这一节介绍了在 ports tree 中的 wxWidgets 库的现状, 以及它与 ports 系统的集成。
许多不同版本的 wxWidgets 库之间是存在相互冲突的 (它们会安装同名的文件) 在 ports 系统中, 这一问题是通过将不同的版本以包含版本号后缀的名字安装来解决的。
这样做的一个最明显的缺点是, 应用程序必须进行修改, 才能找到所希望的版本。 幸运的是, 多数应用程序会调用 wx-config 脚本来确定需要的编译器和连接器选项。 这个脚本会随可用的版本不同而有不同的名字。 主要的应用程序都会尊重环境变量的配置, 或提供一个 configure 参数, 用以指定调用哪个 wx-config。 如果不是这样的话, 就需要对应用程序打补丁了。
为了让您的 port 使用指定版本的 wxWidgets, 可以定义两个变量 (如果只定义了一个, 则另一个会取默认值):
下面是可用的 wxWidgets 版本, 以及对应的 ports:
表 6-25. 可用的 wxWidgets versions
版本 | Port |
---|---|
2.4 | x11-toolkits/wxgtk24 |
2.6 | x11-toolkits/wxgtk26 |
2.8 | x11-toolkits/wxgtk28 |
注意: 从 2.5 版开始, 也提供了对应的 Unicode 版本, 这种版本可以通过 slave port 安装, 与普通版本相比, 它会多一个 -unicode 后缀, 不过这可以通过使用变量来处理 (请参见 第 6.18.4 节)。
在 表 6-24 中的变量, 可以设为下列值或由空格分隔的组合:
除此之外, 还有一些用以从可用的本那本中选择所希望的版本的变量。 这种变量也可以设为一组版本, 而靠前的版本的优先级更高。
也有一些其他应用, 尽管它们本身并不是 wxWidgets 库, 但却与之相关。 这些应用程序可以在 WX_COMPS 变量中使用, 以下是可用的组件:
表 6-28. 可用的 wxWidgets 组件
名称 | 说明 | 版本限制 |
---|---|---|
wx | 主库 | 无 |
contrib | 第三方库 | 无 |
python | wxPython (Python 绑定) | 2.4-2.6 |
mozilla | wxMozilla | 2.4 |
svg | wxSVG | 2.6 |
您可以为每个依赖的组件, 通过冒号分隔的后缀指定其类型。 如果没有指定, 则会使用默认的依赖类型 (参见 表 6-30)。 下面是可用的类型:
表 6-29. 可用的 wxWidgets 依赖类型
名称 | 说明 |
---|---|
build | 联编时需要该组件, 相当于 BUILD_DEPENDS |
run | 运行时需要该组件, 相当于 RUN_DEPENDS |
lib | 联编和运行时均需要该组件, 相当于 LIB_DEPENDS |
组件的默认依赖关系类型, 如下表所示:
wxWidgets 库从其 2.5 版开始支持 Unicode 了。 在 ports 系统中, 这两种版本均有提供, 并可以通过下列变量来选择:
表 6-31. 用以在 Unicode 版本的 wxWidgets 的变量
变量 | 说明 | 作用 |
---|---|---|
WX_UNICODE | 该 port 只能 配合 Unicode 版本使用 | port |
WANT_UNICODE | port 能够与两种版本配合使用, 但希望使用 Unicode 版本 | port |
WITH_UNICODE | 令 port 使用 Unicode 版本 | 用户 |
WITHOUT_UNICODE | 令 port 使用普通版本, 如果支持的话 (即未定义 WX_UNICODE) | 用户 |
警告: 如果 port 同时支持 Unicode 和普通版本, 请不要使用 WX_UNICODE。 如果希望默认启用 Unicode, 应定义 WANT_UNICODE。
要检测系统中安装的版本, 就需要定义 WANT_WX。 如果没有将其设置为特定的版本, 则组件将包含版本后缀。 HAVE_WX 变量在检测完成后会自动填入内容。
例 6-7. 检测已安装的 wxWidgets 版本和组件
下面的片段可以在安装 wxWidgets 的系统中令 port 使用它, 反之则作为一项选项提供。
WANT_WX= yes .include <bsd.port.pre.mk> .if defined(WITH_WX) || ${HAVE_WX:Mwx-2.4} != "" USE_WX= 2.4 CONFIGURE_ARGS+=--enable-wx .endif
下面的片段在系统中有安装过时启用 wxPython 支持, 或在没有安装时作为选项提供; 对 wxWidgets 也是如此办理, 版本皆为 2.6。
USE_WX= 2.6 WX_COMPS= wx WANT_WX= 2.6 .include <bsd.port.pre.mk> .if defined(WITH_WXPYTHON) || ${HAVE_WX:Mpython} != "" WX_COMPS+= python CONFIGURE_ARGS+=--enable-wxpython .endif
以下是一些可以在 port 中使用的变量 (这之前需要定义 表 6-24 中的至少一个变量)。
如果您需要在引用了 bsd.port.pre.mk 之后立即对一些变量进行处理, 则需要定义 WX_PREMK。
重要: 如果定义了 WX_PREMK, 则在此 之后 定义的依赖关系、 组件和变量将不会生效, 您在引用 bsd.port.pre.mk 之前的 wxWidgets port 变量将直接起作用。
例 6-8. 在命令中使用 wxWidgets 变量
下面的片段以执行 wx-config 脚本来得到完整的版本号, 将其赋值到变量中, 并传递给一个程序举例说明了 WX_PREMK 的用法。
USE_WX= 2.4 WX_PREMK= yes .include <bsd.port.pre.mk> .if exists(${WX_CONFIG}) VER_STR!= ${WX_CONFIG} --release PLIST_SUB+= VERSION="${VER_STR}" .endif
注意: 在 target 中的 wxWidgets 变量可以直接使用, 而无需 WX_PREMK 的参与。
某些 GNU configure 脚本在只设置了 WX_CONFIG 环境变量时, 无法自动找到 wxWidgets, 而需要使用额外的参数来加以指定。 您可以使用 WX_CONF_ARGS 变量来给出这些参数。