文章目录
MacPorts - 快速入门一、快速入门二、安装 MacPortsmacOS 软件包 (.pkg) 安装程序源码安装Git 源代码自动更新其他平台帮助
常见问题解答一、常见问题MacPorts 总是从源代码构建吗?端口构建失败怎么办?尝试安装端口时出现错误"C compiler cannot create executables"或"ld: library not found for -lcrt1.10.6.o"或"can't read "build.cmd": Failed to locate 'make' in path",为什么?安装新版本操作系统或迁移到不同CPU架构的新机器后,我的MacPorts安装还能继续工作吗?MacPorts是否支持通用架构?为什么MacPorts默认安装路径是/opt/local?使用 MacPorts 时能否在 /usr/local 中安装软件?在使用MacPorts时能否将框架安装到/Library/Frameworks目录?如何移除或卸载 MacPorts?`${prefix}/var/macports/` 目录下的文件夹用途及占用大量空间的原因构建distfiles软件包`registry` 与旧版 `receipts`软件源代码
出现 `Error: checksum (md5/sha1/rmd160) mismatch for port` 错误该如何处理?哪里可以找到 MacPorts 的图形界面前端?如果 `port selfupdate` 不起作用或 rsync 服务器拒绝连接,该怎么办?`port list` 产生意外输出为什么还没实现 XYZ 功能?它很重要吗?如何报告在使用 macOS、Xcode 或 Apple 硬件预发布版本时遇到的 MacPorts 问题?
二、软件问题为什么需要安装 xorg-* 端口?"Xlib: extension 'RANDR' missing on display '/tmp/launch-XXXXXX/:0'" 是什么意思?MacPorts 会链接系统库而非自身库吗?MacPorts为何使用自己的库?GNOME 菜单为空为什么 Python 端口会有这么多依赖项?何时应使用强制选项 (-f)使用 build_arch如何获取某个端口的所有依赖项列表?为什么不能同时安装包的"`-devel`"和非"`-devel`"版本?为什么我会收到关于错误的C++运行时或`libc++`或`libstdc++`的错误?为什么我会看到“警告…出现-Wimplicit-function-declaration的迹象”?
三、Portfile 开发与维护问题能否依赖另一个端口的特定变体?例如"postgresql8 +server"?为什么 `portindex` 无法工作?我已经设置了本地仓库成为提交者的流程是什么?为什么选择Tcl?
四、运行时错误我尝试禁用一个变体,但它只是告诉我 `port` 命令的正确用法
五、GitHub迁移2016年秋季迁移至GitHub有哪些变化?
六、信息安全与MacPorts基础软件及独立软件包的完整性有哪些控制措施确保MacPorts工具不受恶意贡献污染,且端口脚本仅安装Portfile中声明的内容?如何验证 MacPorts 安装的完整性?MacPorts 在安装审计方面提供哪些能力?
MacPorts - 快速入门
https://www.macports.org/install.php
https://github.comacports/
一、快速入门
安装 Apple 的命令行开发者工具:xcode-select --install为您的 Mac 操作系统版本安装 MacPorts:
macOS Sequoia v15macOS Sonoma v14macOS Ventura v13macOS Monterey v12更旧的操作系统?请查看此处。
二、安装 MacPorts
MacPorts 2.11.4 版本提供多种格式供下载和安装(注意:如果您要升级到新的 macOS 主要版本,请参阅迁移信息页面):
“pkg”安装包:适用于 Sequoia、Sonoma、Ventura 和 Monterey,可通过 macOS 安装程序使用。这是大多数用户在满足以下要求后应遵循的最简单安装方式。此外,还提供旧版系统的安装包:Big Sur、Catalina、Mojave、High Sierra、Sierra、El Capitan、Yosemite、Mavericks、Mountain Lion、Lion、Snow Leopard 和 Leopard。源代码形式:提供 tar.bz2 或 tar.gz 压缩包,适用于需要手动编译并自定义安装的用户。Git 克隆:提供未打包的源代码,适用于希望跟进 MacPorts 开发的用户。port(1) 命令的 selfupdate 目标:适用于已安装 MacPorts 并希望升级到新版本的用户。
我们提供的打包下载文件的校验和包含在对应的校验和文件中。
用于验证 GPG 签名的公钥可在 jmr 的 wiki 页面附件部分找到(直接链接)。
某些端口可能需要安装以下组件:
Apple 的命令行开发者工具:如果您安装的端口或其依赖项没有二进制版本,则需要安装此工具。
在较新的 macOS 版本中,可以通过在终端运行以下命令安装:
xcode-select --install
旧版本可在 Apple Developer 站点找到,或通过 Xcode 回溯至版本 4 进行安装。Xcode 3 或更早版本的用户需在安装时勾选相应选项(“UNIX Development”、“System Tools”、“Command Line Tools” 或 “Command Line Support”)来完成安装。
2、(可选)从源码构建某些端口时,需使用苹果的 Xcode 开发者工具。MacPorts 会在此情况下提示您。
强烈建议使用操作系统支持的最新版本,但 Snow Leopard 用户例外,推荐使用最后一个免费版本 3.2.6:
Sequoia 需 16.0 或更高版本Sonoma 需 15.0 或更高版本Ventura 需 14.1 或更高版本Monterey 需 13.1 或更高版本Big Sur 需 12.2 或更高版本Catalina 需 11.3 或更高版本Mojave 需 10.0 或更高版本High Sierra 需 9.0 或更高版本Sierra 需 8.0 或更高版本El Capitan 需 7.0 或更高版本Yosemite 需 6.1 或更高版本Mavericks 需 5.0.1 或更高版本Mountain Lion 需 4.4 或更高版本Lion 需 4.1 或更高版本Snow Leopard 需 3.2 或更高版本Leopard 需 3.1 或更高版本
可通过 Apple Developer 站点、Mac 操作系统安装光盘/DVD 或 Mac App Store 获取。
Xcode 4 及更高版本用户需通过启动 Xcode 或运行以下命令接受许可协议:
xcodebuild -license
3、(可选)X11 窗口环境,适用于依赖其功能运行的移植软件。您有多种 X11 服务器选择:
从 MacPorts 安装 xorg-server 端口(推荐)。
XQuartz 项目 提供完整的 macOS X11 发行版,包括服务器、客户端库和应用程序。
在旧版操作系统中,Apple 的 X11.app 由“X11 User”软件包提供。在 Lion 系统上始终预装,而在更早版本的操作系统安装光盘/DVD 中为可选安装项。
macOS 软件包 (.pkg) 安装程序
在 Mac 上安装 MacPorts 最简单的方法是下载适用于 Sequoia、Sonoma、Ventura、Monterey、Big Sur、Catalina、Mojave、High Sierra、Sierra、El Capitan、Yosemite、Mavericks、Mountain Lion、Lion、Snow Leopard 或 Leopard 的 pkg 或 dmg 文件,然后双击其中的 pkg 文件运行系统安装程序,按照屏幕上的指示完成安装。
此过程将在您的系统上安装一个功能完整且默认配置的 MacPorts,可直接使用。如果需要,安装程序会自动调整您的 shell 配置文件,以包含运行 MacPorts 及其安装程序所需的设置,但您可能需要打开一个新的 shell 才能使这些更改生效。
安装程序还会为您运行 MacPorts 的 “selfupdate” 命令,确保您获得最新的可用版本以及包含端口构建和安装指令的 “Portfiles” 的最新修订。安装完成后,建议您定期手动执行此步骤,以保持 MacPorts 系统始终处于最新状态。
sudo port -v selfupdate
此时,您应该已经准备好享受 MacPorts 带来的便利了!
在命令行提示符下输入 man port 命令,或者访问我们的指南,以获取更多关于如何使用 MacPorts 的信息。如需帮助,请参阅帮助文档。
源码安装
如果您选择通过源码方式安装 MacPorts,在下载压缩包后、开始安装 ports 前,仍需完成几个步骤,即编译并安装 MacPorts 本身:
1、进入下载包的目录,运行命令 tar xjvf MacPorts-2.11.4.tar.bz2 或 tar xzvf MacPorts-2.11.4.tar.gz,具体取决于您下载的是 bz2 还是 gz 格式的压缩包。
MacPorts-2.11.4.tar.bz2 : https://github.com/macports/macports-base/releases/download/v2.11.4/MacPorts-2.11.4.tar.bz2
[MacPorts-2.11.4.tar.gz : https://github.com/macports/macports-base/releases/download/v2.11.4/MacPorts-2.11.4.tar.gz
2、构建并安装刚解压的源码:
cd MacPorts-2.11.4
./configure && make && sudo make install
或者:
cd ../
rm -rf MacPorts-2.11.4*
以下步骤需要使用管理员账户执行,安装过程中sudo会要求输入密码。该过程将安装一个全新的MacPorts系统。如果执行了可选步骤,还会移除当前不再需要的MacPorts-2.11.4源码目录及对应的压缩包。
如需定制安装,您应阅读./configure --help | more的输出内容,并根据需要在上述步骤中向配置脚本传递相应的参数选项。
您需要手动调整shell环境以适配MacPorts及您选择的安装前缀(即传递给configure脚本的--prefix参数值,默认为/opt/local):
将${prefix}/bin和${prefix}/sbin添加到PATH环境变量开头,使MacPorts安装的程序优先于系统提供的同名程序执行。
若已存在标准的MANPATH环境变量(即不包含任何空组件的变量),请将${prefix}/share/man路径添加其中,以便shell能查找到MacPorts安装的手册页。
仅限Tiger及更早系统:添加适当的X11 DISPLAY环境变量以运行依赖X11的程序(Leopard系统会自动处理此需求)。
最后,您需要通过MacPorts rsync服务器同步安装:
sudo port -v selfupdate
安装完成后,MacPorts 就可以开始安装软件包了!
建议定期运行上述命令以保持安装的软件包处于最新状态。在命令行提示符下输入 man port 和/或访问我们的指南以获取更多关于使用 MacPorts 的信息。如需帮助,请参阅帮助页面。
Git 源代码
如果你是开发者或喜欢尝鲜的用户,希望获取最新的变更和功能添加,可以通过 git 获取 MacPorts 的源代码。请参阅指南中关于从 git 安装的部分。
特定用途的分支也可以在 https://github.com/macports/macports-base/branches 链接中找到。
另外,如果你只想浏览 git 仓库而不想检出代码,可以通过 GitHub 网页界面查看。
自动更新
如果您已安装 MacPorts 且网络环境允许使用 rsync 协议(默认使用 TCP 端口 873),升级到当前最新版本 2.11.4 的最简单方式是通过 port(1) 命令的 selfupdate 目标。该操作会同步更新 ports 树(执行同步操作),并在当前安装版本过旧时自动重建安装,同时保留您所做的任何自定义配置。
其他平台
MacPorts项目的核心关注点并非在macOS以外的平台上运行,因此保持跨平台兼容性并非其积极追求的开发目标。不过,这也不是一个被明确反对的目标,因此确实存在对一些符合POSIX标准的平台(如*BSD和GNU/Linux)的实验性支持。
要在这些其他平台上运行MacPorts,需满足以下全部要求(假设您已具备GCC和X11等基础组件):
mtree:用于目录层级管理。rsync:用于同步ports。cURL:用于下载distfiles。GNUstep (Base):用于Foundation支持(可选,可通过配置参数禁用)。OpenSSL:用于签名验证,也可选用于校验和。libmd可作为校验和的替代方案。
通常,您必须通过源码安装或git检出的方式在这些平台上运行MacPorts。
帮助
如果您在安装和/或使用 MacPorts 时遇到任何问题,可以通过项目指南和我们的Trac 门户获取广泛主题的帮助。特别相关的部分包括前者的安装和使用章节,以及Wiki中的FAQ部分,这里记录了我们在邮件列表中经常收到的问题。
如果这些资源未能解答您的问题,或者您需要任何形式的扩展支持,可以通过多种方式联系我们!
常见问题解答
https://trac.macports.org/wiki/FAQ
我们还提供了一个 HOWTO 指南,其中可能解答了此处未列出的问题,并提供了使用 MacPorts 执行各种任务的有用教程。
一、常见问题
MacPorts 总是从源代码构建吗?
2011年发布的MacPorts 2.0.0增加了安全安装预构建二进制归档文件的功能。在默认配置下,您无需任何额外操作即可享受此功能——如果存在可用的归档文件,MacPorts会自动从归档安装。
如果没有可用的归档文件,MacPorts会回退到从源代码构建。这种情况可能由以下原因导致:
每个端口仅预构建了默认的变体组合。如果您安装时指定了不同的变体,该端口将从源代码构建。某些软件的许可证与其依赖项不兼容,导致无法合法分发二进制文件。常见例子是采用GPL许可的软件依赖OpenSSL,但未添加允许链接的特殊例外条款。预构建归档仅针对有限的CPU架构和操作系统版本提供。如果您修改了以下macports.conf设置中的任意项,预构建归档将与您的安装不兼容而无法使用:prefix、applications_dir、frameworks_dir、cxx_stdlib、delete_la_filesPortfile在git仓库更新后,Buildbot需要一定时间完成构建并发布归档。如果您直接从git同步端口树,这个延迟可能更明显。
通过使用符合您需求的自定义归档站点(而非官方站点),可以规避大部分限制,当然前提是有人负责构建这些归档。详见howto/ShareArchives2。
端口构建失败怎么办?
1、首先确保你拥有最新版的 MacPorts 和 ports 树。执行命令 sudo port selfupdate 进行更新。
2、确认 Xcode 是否为最新版本。旧版 Xcode 可能导致某些端口构建失败。
3、清理该端口。运行命令 sudo port clean
4、重试构建。如果你的 /usr/local 目录中存在文件
或同时使用其他包管理器(如 fink、homebrew 或 pkgsrc),还可以尝试跟踪模式(使用 -t 参数):
sudo port install
sudo port -t install
5、如果上述方法无效,请检查 ProblemHotlist 查看您的问题是否已被记录。
若未找到相关记录,请搜索现有工单。在此字段中输入故障端口的名称,即可查看该端口的所有工单:
如果没有匹配的工单,请新建一个。请遵循我们关于如何正确创建新工单的指南。
尝试安装端口时出现错误"C compiler cannot create executables"或"ld: library not found for -lcrt1.10.6.o"或"can’t read “build.cmd”: Failed to locate ‘make’ in path",为什么?
你需要安装Xcode和命令行工具。
注意: 从2.3.0版本开始,MacPorts应能检测到此问题并发出警告。更多信息请参阅ProblemHotlist#clt。
安装新版本操作系统或迁移到不同CPU架构的新机器后,我的MacPorts安装还能继续工作吗?
通常情况下答案是否定的。请参阅迁移指南了解如何恢复正常使用。
注意: 从2.3.0版本开始,MacPorts会检测这种情况。请按照迁移指南操作,使您的MacPorts安装适应新操作系统。
MacPorts是否支持通用架构?
MacPorts可在Apple Silicon、Intel及PowerPC架构的Mac上运行,但默认情况下,安装的port仅针对当前运行架构编译。这意味着若您从PowerPC Mac迁移至Intel机型并使用迁移助手转移数据,应在新机器上重新安装所有port以获取针对Intel架构编译的版本。具体可参考前文"Migration"链接中的说明。
对于许多port,现在存在替代方案:安装时选择+universal变体,MacPorts将安装支持多处理器架构的通用二进制文件。支持的架构集合由macports.conf中的universal_archs参数控制。
使用+universal能让您在首选架构无法编译某些port时仍可运行它们。例如wine port仅支持i386架构,但其依赖项中有许多可支持x86_64。在x86_64硬件上,通过+universal编译的依赖项可同时支持i386和x86_64架构的port。
历史上,+universal在以下场景也很实用:计划短期内迁移到不同架构的Mac,或在Intel与PowerPC Mac共用的外置硬盘上安装MacPorts。但需注意,由于port维护者未必测试过+universal变体,即使安装过程未报错,某些port可能仍无法正常工作。若发现某port无法通过+universal编译或运行异常,请提交错误报告。若能提供修复补丁则更佳。
部分port可能仅支持PowerPC或Intel Mac,有些可能在32位架构正常但64位架构失效。这类情况中有些是需要修复的缺陷。若软件存在新版,应向port维护者反馈——新版本可能已支持双架构。若port已使用最新版本,则需联系软件上游作者,可能需要更新软件本身。另有些软件是专为特定处理器架构编写,无法适配其他架构。
另请参考Universal(内容已严重过时)查看曾测试过+universal支持的port列表及其结果。
为什么MacPorts默认安装路径是/opt/local?
传统上,许多UNIX系统将第三方软件安装在/usr/local目录下。然而,正是出于这个原因,将MacPorts安装在/usr/local下容易引发问题。许多其他软件包和打包系统也会安装到/usr/local目录,可能会意外覆盖MacPorts安装的文件,反之亦然。
虽然这可以被归咎于用户的操作失误,但现实情况是,人们常常盲目点击安装程序,导致/usr/local(以及其他重要目录)下的文件冲突频繁发生。MacPorts不希望成为这种冲突的受害者,而/opt/local提供了完美的隔离方案(当然,任何其他专用目录也能实现相同效果)。
此外,/usr/local传统上存放的是系统本地的管理工具;MacPorts也不希望干扰这些内容。
(基于同样的原因,fink选择使用/opt/sw作为其安装前缀。)
使用 MacPorts 时能否在 /usr/local 中安装软件?
不能。尽管 MacPorts 安装在其他位置,但安装在 /usr/local 的软件仍可能干扰 MacPorts。某些软件(尤其是 GNU auto* 工具链和 gcc)会检查 /usr/local 中的外部头文件、库文件和二进制文件。某些 port 可能(也确实会)因构建过程中发现并使用了 /usr/local 中不兼容的内容而导致构建失败。优秀的 port 会通过显式指定 --with-libfoo=/opt/local/lib/ 或彻底禁用此类潜在依赖(如 --disable-foo 或 --without-bar)来避免该问题,但并非所有 port 都能做到这一点。即使正确使用了本应位于 /opt/local 的所有文件,若 /usr/local 中存在同名文件,操作系统在 /usr 中提供的头文件和库仍会被覆盖。
如果您因 port 构建失败(由 /usr/local 中的内容引发)而寻求帮助,我们会要求您移除 /usr/local 中的安装内容,或在构建期间临时重命名 /usr/local 使其完全不可见。
请注意,从 2.3.0 版本开始,MacPorts 能自动向 port 的构建系统隐藏 /usr/local(以及 port 不依赖的所有其他文件)。该功能称为追踪模式(trace mode),可通过向 port 命令添加 -t 标志启用,例如:
sudo port -t install
您会注意到,启用追踪模式时会带来轻微的性能损失,并且由于环境变化,极少数端口可能无法构建(目前已知仅go和sbcl端口会受影响)。在追踪模式下出现沙箱违规警告属于正常现象。如果某个端口在追踪模式下构建失败,这很可能是一个缺陷。若尚未存在相关工单,您应当提交一个新问题。
在使用MacPorts时能否将框架安装到/Library/Frameworks目录?
不建议这样做。这可能会干扰你通过MacPorts安装的软件,其影响方式与将软件安装到/usr/local目录所产生的问题类似。如果你因/Library/Frameworks目录中的内容导致某个port编译失败而向我们求助,我们会要求你移除该目录下的安装内容,或者在编译期间临时重命名/Library/Frameworks目录使其完全失效。
如何移除或卸载 MacPorts?
请参阅指南。
${prefix}/var/macports/ 目录下的文件夹用途及占用大量空间的原因
man porthier 中提到:“MacPorts 运行时数据”,但实际上该目录还包含更多子文件夹:
构建
在构建 ports 时使用,通常只包含空文件夹,不占用太多空间。在构建某个 port 时,会有一个软链接 ${prefix}/var/macports/sources/rsync.macports.org/release/ports/
distfiles
每个已构建 port 的下载源代码,可通过 port clean --dist
软件包
包含每个已安装端口(port)的二进制归档文件。可通过执行 port clean --archive
registry 与旧版 receipts
包含每个已安装端口的详细信息,例如哪些文件属于该端口及其对应的校验和。
软件
包含已安装软件的压缩归档文件。当某个端口被激活时,其文件会从此处的压缩文件中解压到 ${prefix} 目录下。执行 port uninstall
源代码
在子文件夹 rsync.macports.org/release/base 中存放的是 MacPorts 自身的源代码(例如用于 port(1) 命令的部分)。执行 port selfupdate 会从 MacPorts rsync 服务器更新这部分内容。而在子文件夹 rsync.macports.org/release/ports 中,则按类别存放各个端口的文件夹及其内容,其中包含对应的 Portfile 和补丁文件。通过 port sync 或 port selfupdate 命令均可从 MacPorts rsync 服务器更新这部分数据。
出现 Error: checksum (md5/sha1/rmd160) mismatch for port 错误该如何处理?
MacPorts 会计算下载文件的校验和,以确保文件未被损坏或篡改。每个 Portfile 中都列出了该端口将要下载文件的校验值(使用 md5、sha1 和/或 rmd160 算法)。如果下载文件计算出的校验值与 Portfile 中列出的不匹配,这意味着你下载的文件与端口设计者在创建端口时使用的文件不同,因此 MacPorts 会停止安装。
应急处理方案:重新下载文件。
$ sudo port selfupdate
$ sudo port clean --dist
$ sudo port install
如果上述方法无效,您需要进一步排查校验和不匹配的原因。
请注意:在确认自身配置无误前,请勿提交工单。提交工单时请务必注明下载所使用的镜像源。
校验和不匹配可能由以下原因导致:
1、文件损坏。若因传输过程损坏,请重新下载(方法如前所述)。若服务器端文件已损坏,您能做的有限。请在Trac提交缺陷报告并指派给该端口维护者。解决方案:尝试其他镜像源(如有),或在MacPorts用户邮件列表询问是否有人能提供完整文件。
2、开发者进行了"静默升级"。有时上游开发者会不通知MacPorts就修改发布包内容而不更新版本号。可能是用不同压缩工具重新打包,或修正文档拼写等微小改动。这种做法会给依赖校验和的MacPorts等系统带来困扰。请先联系开发者确认,若无法联系,可自行验证:全网搜索匹配Portfile校验值的旧版本,下载开发者站点当前版本后比较内容(如使用diff -r -u <旧版本> <新版本>)。若改动微小或无实质变化,可安全更新Portfile校验值并通知维护者。无法判断时,请在用户邮件列表求助。
3、文件遭篡改。虽然概率较低,但理论上开发者或镜像源分发的文件可能被恶意篡改(实践中确有案例)。攻击者可能植入病毒、木马等恶意代码。请通过联系开发者或对比旧版本进行确认,也可联系端口维护者或用户邮件列表。
4、代理拦截请求。某些网络代理会阻止文件/tar/zip下载,或限制特定设备联网。此时代理可能返回"禁止访问"消息(错误显示200状态码),被MacPorts误认为有效文件。检查下载内容即可确认,若属实则需联系网络管理员开通权限。
5、下载服务器或DNS服务器异常。参见MisbehavingServers。
哪里可以找到 MacPorts 的图形界面前端?
目前有多个正在开发中的 MacPorts 图形界面工具:
PortAuthority 是一个历史悠久的工具,自 2019 年起转为捐赠软件。JPortsUI 是一个基于 Java 的免费开源图形界面。Porticus 目前无法使用,因为它尚未更新以支持 OS X 10.7 及以上版本或 MacPorts 2.0 及以上版本。
如果 port selfupdate 不起作用或 rsync 服务器拒绝连接,该怎么办?
首先尝试运行 sudo port -d selfupdate 以显示所有错误信息。如果连接 rsync 服务器失败,可能是防火墙或其他网络控制软件阻止了连接。
某些防火墙会阻止使用 rsync 协议(TCP 端口 873)的连接。请向网络管理员申请允许出站连接到该端口,或改用下文提到的替代方法之一。
如果使用 LittleSnitch,请为 rsync(路径为 /usr/bin/rsync)创建一条规则,允许连接到服务器主机名 rsync.macports.org,端口 873(rsync),协议 6(TCP)。确保该规则已启用。
连接问题也可能仅针对某些主机存在。我们的主镜像由德国埃尔朗根-纽伦堡大学托管,位于德国科研网络内。如果您认为连接其镜像服务可能存在问题,可以尝试使用我们的其他镜像。
此外,我们的主镜像支持 IPv6 连接。如果您的网络存在 IPv6 连接问题,可以尝试使用不提供 IPv6 支持的镜像。
如果无法通过防火墙或修复网络问题,还可以采用以下稍显手动的方法:
使用 Git 同步 Port 树下载每日构建的压缩包并更新
port list 产生意外输出
你可能需要使用 port installed 或 port outdated 替代。
如果你原本想用 port list installed,实际应该使用 port installed(或等效的 port installed installed)。
如果你原本想用 port list outdated,实际应该使用 port outdated(或等效的 port outdated installed)。
如果你原本想用 port list someport,实际可能需要 port installed someport 或 port outdated someport。
对于命令行中指定的每个端口(或从伪端口如 installed 扩展而来),port list 会显示当前在 ports 树中可用的该端口版本——而非当前已安装的版本。
例如,如果你安装了端口 foo 的版本 1 和 2(其中 2 是当前可用的最新版本),port list installed 会显示 foo 的版本 2 两次,而 port installed foo 则会分别显示 foo 的版本 1 和版本 2 各一次。
为什么还没实现 XYZ 功能?它很重要吗?
虽然有许多改进可以提升 MacPorts,但时间有限且项目始终缺乏基础开发人员。这意味着新功能必须按优先级排序(通常错误修复更重要),而其他实用功能可能长时间无法实现。如果您想帮助改进 MacPorts,请参考贡献指南了解如何参与。
如何报告在使用 macOS、Xcode 或 Apple 硬件预发布版本时遇到的 MacPorts 问题?
如果问题似乎出在 Apple 的预发布软件或硬件上,请向 Apple 提交反馈。否则,请参考以下说明。
如果您能访问 macOS、Xcode 或 Apple 硬件的测试版、预览版或预发布版本,几乎可以肯定您与 Apple 签订了保密协议(NDA)。我们鼓励您遵守该协议,但我们并非协议方,也不清楚协议的具体内容,因此无法提供解释建议。如果您对 NDA 允许或禁止的行为存在疑问,请咨询合格的法律专业人士。
Apple 的 NDA 通常禁止公开披露协议涵盖的未公开信息,这可能意味着您不能在 MacPorts 的公共沟通渠道(包括邮件列表、工单或拉取请求、IRC 或聊天)中发布构建日志、错误消息或截图。如果这对您适用,您或许可以私下与同样签署了相同 Apple 预发布软件或硬件 NDA 的 MacPorts 开发者共享信息。
以下是 MacPorts 开发者及其签署的预发布 Apple 产品列表,您可以向他们报告问题:
MacPorts 开发者签署的预发布软件/硬件Mark AndersonmacOS 15 Sequoia 开发测试版
如果您是签署了 Apple 预发布软件或硬件 NDA 的 MacPorts 开发者,并愿意协助解决相关问题,请编辑本页面并将您的名字添加到上表中。
二、软件问题
为什么需要安装 xorg-* 端口?
MacPorts 不使用系统提供的 X11 客户端库,而是安装自己的副本。这样能为更新不及时的老旧机器(尤其是没有兼容 pkg-config 的 X11 SDK 的 Tiger 系统)提供更一致的支持。MacPorts 中的大多数 X11 软件包都比苹果提供的版本更新,通常反映了 XQuartz 项目的最新成果。
不必担心,MacPorts 构建的应用程序仍然与系统提供的 X11 服务器兼容,任何基于 /usr/X11 库构建的其他 X11 应用程序也能与 MacPorts 的 X11 服务器(xorg-server 和 xorg-server-devel)协同工作。
“Xlib: extension ‘RANDR’ missing on display ‘/tmp/launch-XXXXXX/:0’” 是什么意思?
许多 X11 程序会尝试使用 RANDR 扩展功能,当该扩展不可用时就会显示此警告。在 Snow Leopard 及更早版本中,苹果提供的 X11 服务器不支持 RANDR 扩展。XQuartz 2.6.0 版本以及 MacPorts 的 X11 服务器已支持该功能。
除非您明确需要 RandR 功能,否则可以安全忽略此警告。
MacPorts 会链接系统库而非自身库吗?
不会,MacPorts 维护自己的库版本。具体原因请参阅下一个问题。
你可能会发现某些端口会链接部分系统库。其中一些是刻意为之,例如当 MacPorts 版本缺少关键功能时(比如需要 Kerberos 支持的端口会使用 Mac OS X 提供的库,而非 MacPorts 的库)。其他情况下,这属于相关端口的缺陷,应提交问题票以便修正。
MacPorts为何使用自己的库?
MacPorts选择使用自有库有多个原因。这能使不同macOS版本间的端口保持更高一致性。举例来说,如果我们能依赖MacPorts提供的openssl 1.0.0,就无需为每个需要ssl的端口测试所有可能的openssl安装版本。苹果的软件时常会出现问题(例如openssl拒绝与旧版zlib兼容,但苹果曾长期发布存在漏洞的旧版zlib头文件)。即便苹果的版本没有缺陷,它们也往往不是最新版——苹果的习惯是除非遇到必须修复的安全漏洞,否则不会更新macOS中的库。
这种策略的缺点微乎其微:在拥有数百GB硬盘的情况下,为Python安装浪费几MB空间几乎可以忽略不计;而随着计算机性能提升,编译额外端口所需的时间也在持续减少。
GNOME 菜单为空
更多信息请参阅本 Wiki 的 GNOME 部分。
为什么 Python 端口会有这么多依赖项?
早期版本的 Python 端口要么使用变体(如 python23),要么将部分模块从基础端口分离出来(如 python24),以减少端口的依赖项数量。使用变体存在弊端,因为要添加特定模块(例如 readline 支持)就必须完全重新构建端口;此外,当前依赖项无法指定变体(参见工单 #126)。
为这些模块使用独立端口(如 py-readline)可以避免完全重建基础端口,并能作为依赖项使用,但也会带来其他问题。其一是这些模块通过 Python 的标准 distutils 方法安装,导致它们的安装位置与常规安装不同(参见工单 #12369)。其二是许多 Python 开发者对安装 Python 有特定预期,而仅安装 python24 无法满足这种预期。
何时应使用强制选项 (-f)
强制选项 (-f) 的使用场景较为罕见,但过去的一些建议曾频繁推荐使用它。目前最常见的需求是当您在 MacPorts 前缀目录中遇到游离文件时——这些文件不属于任何端口,却阻碍了某个端口的安装。此时,port 命令会显示类似以下错误信息:
Error: Activating some-port @1.0_0 failed: Image error: /opt/local/path/to/stray/file already exists and does not belong to a registered port. Unable to activate port some-port.
除非你明确知道该文件的来源且需要保留它,否则强制操作是合理的。但请注意,不要与install一起使用,而应与activate配合使用。
sudo port -f activate some-port
在 MacPorts 1.8 之前,-f 参数也用于强制升级端口以添加新变体。现在该功能已被 upgrade 命令的 --enforce-variants 选项取代。
sudo port upgrade --enforce-variants curl +ssl
这将重新安装 curl 端口,并添加 +ssl 变体。
使用 build_arch
MacPorts 1.8 在 macports.conf 中引入了一个新选项:build_arch。该选项允许你控制构建目标架构。例如,你可以用它来在 10.5 系统(默认 32 位)上构建 64 位程序,或在 10.6 系统(通常默认 64 位)上构建 32 位程序。
另一个使用场景是,当在基于 Intel 的 Mac 上编写 port 时,可以使用以下命令为 arm64 架构生成校验和:
sudo port -d checksum
关于此功能的文档可在 macports.conf 的手册页以及指南中找到。
在尝试使用 build_arch 前,需要注意两个问题:
许多端口会忽略用于选择架构的 -arch 标志,很可能完全无法构建(如果遇到此类问题,请提交工单以便修复)
必须在构建任何端口前设置 build_arch(需在全新干净的安装环境下操作),否则会因为部分端口采用一种架构而其他端口采用另一种架构导致严重问题(若需切换架构且已安装端口,可通过执行 “sudo port -f uninstall installed” 卸载所有端口后重新安装,或参考Migration文档使用自动化脚本)
如何获取某个端口的所有依赖项列表?
从 MacPorts 1.9.0 版本开始,您只需运行:
port rdeps
在代码仓库的contrib部分还有一个脚本,该脚本能利用graphviz生成端口依赖关系的图表。
为什么不能同时安装包的"-devel"和非"-devel"版本?
MacPorts 不会像某些Linux发行版那样将开发头文件拆分成单独的包。在MacPorts中,"-devel"版本通常是主包的预发布版本(即alpha或beta版)。
为什么我会收到关于错误的C++运行时或libc++或libstdc++的错误?
在Xcode 5.x之前的版本以及OS X 10.9之前的系统中,苹果提供的g++基于旧的libstdc++运行时。从Xcode 5和OS X 10.9开始,苹果转而使用clang及其符合C++11标准的libc++。C++11运行时与旧的C++运行时并不兼容。
在10.9之前的系统上单独构建C++11运行时是完全可能的。问题在于它实际上从来不是独立的;它存在于一个由苹果定义的生态系统中。在10.8及更早版本中,这个生态系统并不支持C++11。虽然你可以构建自己的C++11生态系统,但它不会与其他任何内容兼容。特别是,它将与苹果作为基础系统或Xcode一部分提供的任何C++库不兼容。如果你尝试将苹果兼容的C++库与之一起使用,将会遇到链接错误甚至崩溃。
在尝试让这些内容共存一段时间后,MacPorts放弃了,并承认唯一可靠的方法是使用与苹果库兼容的内容。这意味着在10.8及更早版本中,只能使用支持C++11之前接口的旧版LLVM/clang(由libstdc++或苹果提供的兼容libc++支持);而在10.9及更高版本中,只能使用支持C++11接口的新版LLVM/clang(由现代libc++支持,但不包括旧版OS X提供的libc++)。其他任何组合可能在运气好的情况下工作,但完全无法保证,并且已经导致了许多端口构建失败,因此MacPorts不再尝试支持这些组合。
为什么我会看到“警告…出现-Wimplicit-function-declaration的迹象”?
在构建端口时,您可能会在配置日志中看到类似这样的消息:“警告:配置日志文件显示存在-Wimplicit-function-declaration的迹象;请检查功能是否被意外禁用”。
这是对端口源代码上游开发者的警告。必须逐一调查并处理每个出现的情况。作为端口用户,我们建议您在观察到此类消息的每个端口中提交错误报告。针对该端口提交MacPorts工单,包含您看到的具体消息,这是有帮助的第一步。这能让其他使用和维护该端口的人员跟踪问题。诊断端口的配置代码试图做什么会更有帮助。最有帮助的是向提供源代码的上游项目提交错误报告。这才是问题最终需要修复的地方。然后修复会向下游传递到MacPorts。问题将得到解决。该消息将不再出现。
有关此消息的详细信息、其原因以及应对措施,请参阅WimplicitFunctionDeclaration。
三、Portfile 开发与维护问题
能否依赖另一个端口的特定变体?例如"postgresql8 +server"?
不行。这是工单 #126 记录的问题。当前的依赖引擎只能处理"端口X需要端口Y"或"端口X需要文件Z(可由端口Y提供)"这类基础依赖关系,无法指定更具体的变体要求。虽然邮件列表存档中有关于改造引擎的讨论,但尚未形成具体方案。
正因如此,真正实用的变体其实不应该作为变体存在,而应该直接整合到主端口中。有时将变体拆分为子端口或独立端口会更合理(例如 postgresql83-doc 和 postgresql83-server 这两个独立端口,而不是作为 postgresql83 端口的 +doc 或 +server 变体)。
为什么 portindex 无法工作?我已经设置了本地仓库
要使 portindex 正常工作,您的本地仓库需要将端口(ports)按类别嵌套存放,相关文档中对此有详细说明。
成为提交者的流程是什么?
该流程与其他开源项目基本相同。关于获取MacPorts提交权限的具体要求,请参阅相关文档以及新提交者指南。
为什么选择Tcl?
MacPorts的两位原始开发者Landon Fuller和Jordan K. Hubbard在邮件列表中的这些帖子,解释了为何他们选择使用Tcl来开发MacPorts:
http://opendarwin.org/pipermail/darwinports/2002-October/015387.html http://opendarwin.org/pipermail/darwinports/2005-January/023888.html https://lists.macports.org/pipermail/macports-dev/2013-June/023077.html
四、运行时错误
我尝试禁用一个变体,但它只是告诉我 port 命令的正确用法
当使用
port
命令中的短横线会被解析为选项,因此会显示用法信息。需要用双短横线进行转义:
port
五、GitHub迁移
2016年秋季迁移至GitHub有哪些变化?
详情请参阅 GitHubMigration。
六、信息安全与MacPorts基础软件及独立软件包的完整性
有哪些控制措施确保MacPorts工具不受恶意贡献污染,且端口脚本仅安装Portfile中声明的内容?
基础软件完整性保障:
MacPorts.dmg安装程序由项目成员之一签名,确保初始安装的完整性。自我更新过程同样使用签名压缩包,并通过安装包内包含的公钥进行验证。
MacPorts仅向具有长期优质贡献记录的人员授予提交权限。其他贡献者必须通过提交拉取请求,由具有提交权限的成员审核后方可合并。
端口树完整性保障:
分发的端口树经过签名,同步Portfiles时会验证签名。Portfiles直接来自GitHub git仓库,因此整个端口树可通过提交哈希值唯一标识。
虽然可能性极低,但理论上存在提交者"变节"的风险(但通常会被发现),或上游软件包本身被篡改的情况。
Portfiles完整性保障:
依赖合并至端口树中的内容,这些内容通过GitHub的拉取请求机制开发,并由项目成员审核。Portfiles包含校验和,用于验证构建软件所用的上游源码。所有下载文件必须对所有用户保持一致(这也是正确镜像这些分发文件的必要条件)。
基础代码、端口树及大多数上游软件都提供可获取的源代码,因此在关键场景使用前务必自行进行完整审计。
如何验证 MacPorts 安装的完整性?
理论上,您可以将现有的基础软件安装与已签名的 tar 包进行比较。但目前尚无现成的工具支持此操作。此外,部分端口会在本地构建,因此无法为所有内容提供单一的“标准”签名 tar 包。
MacPorts 在安装审计方面提供哪些能力?
作为开源软件,MacPorts 天生就比专有二进制文件更易于审计,但缺点是您必须自行承担责任。MacPorts 项目无法提供任何保证,并且必须免除所有责任。至于本地文件的完整性,我们主要依赖文件系统权限。不过,第三方文件完整性检查工具应该可以正常工作。
2025-08-13(三)