perlmacosx - Mac OS X 下的 Perl
本文档简要介绍了 Mac OS X 下的 Perl。
curl -O https://www.cpan.org/src/perl-5.38.2.tar.gz
tar -xzf perl-5.38.2.tar.gz
cd perl-5.38.2
./Configure -des -Dprefix=/usr/local/
make
make test
sudo make install
最新的 Perl 版本(截至撰写本文时为 5.38.2)可以在从 10.3 "Panther" 开始的所有 Mac OS X 版本下无需修改即可构建。
为了构建您自己的 Perl 版本,您需要“make”,它是 Apple 开发者工具的一部分,也称为 Xcode。从 Mac OS X 10.7 “Lion” 开始,它可以作为“命令行工具”捆绑包从 https://developer.apple.com/downloads/(您需要一个免费帐户才能登录)单独下载,或者作为 Xcode 套件的一部分,在 App Store 免费提供。Xcode 是一个相当大的应用程序,因此,除非您已经拥有它或确实需要它,否则建议您从上面的链接单独获取“命令行工具”捆绑包。如果您想在 Xcode 中执行此操作,请转到 Xcode -> 首选项 -> 下载,然后选择“命令行工具”选项。
在 Mac OS X 10.3 “Panther” 和 10.6 “Snow Leopard” 之间,“命令行工具”捆绑包被称为“unix 工具”,通常随 Mac OS 安装 DVD 提供。
早期的 Mac OS X 版本(10.2 “Jaguar” 及更早版本)不包含完全线程安全的 libc,因此线程不受完全支持。此外,早期版本包含有错误的 libdb,因此已知某些 DB_File 测试在这些版本上会失败。
此版本的默认安装位置使用 /usr/local 下的传统 UNIX 目录布局。这是大多数用户的推荐位置,并且不会干扰 Apple 提供的 Perl 及其模块。
使用“/usr”的安装前缀将导致目录布局镜像 Apple 的默认 Perl,核心模块存储在“/System/Library/Perl/${version}”中,CPAN 模块存储在“/Library/Perl/${version}”中,并且添加“/Network/Library/Perl/${version}”到 @INC 用于存储在文件服务器上并由许多 Mac 使用的模块。
首先,将 SDK 的路径导出到构建环境中
export SDK=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
请确保 SDK 版本(即“.sdk”之前的数字)与您的系统匹配(在本例中为 Mac OS X 10.8 “Mountain Lion”),因为可能安装了多个 SDK。还要确保路径存在于您的系统中,如果不存在,请确保 SDK 正确安装,因为它应该随上面提到的“命令行工具”捆绑包一起提供。最后,如果您使用的是较旧的 Mac OS X(10.6 “Snow Leopard” 及更低版本)运行 Xcode 4.2 或更低版本,则 SDK 路径可能类似于 '/Developer/SDKs/MacOSX10.3.9.sdk'
。
您可以通过导出 Perl 的“ccflags”和“..flags”配置变量的一些附加项来使用 SDK
./Configure -Accflags="-nostdinc -B$SDK/usr/include/gcc \
-B$SDK/usr/lib/gcc -isystem$SDK/usr/include \
-F$SDK/System/Library/Frameworks" \
-Aldflags="-Wl,-syslibroot,$SDK" \
-de
注意:从 Mac OS X 10.6 "Snow Leopard" 开始,Apple 只支持基于 Intel 的硬件。这意味着,除非您拥有运行在 ppc 上的旧款 Apple 计算机,或者希望创建具有向后兼容性的 Perl 二进制文件,否则您可以安全地跳过此部分。
您可以将 Perl 编译为通用二进制文件(为 ppc 和 intel 构建)。在 Mac OS X 10.4 "Tiger" 中,您必须导出 SDK 的 'u' 变体
export SDK=/Developer/SDKs/MacOSX10.4u.sdk
Mac OS X 10.5 "Leopard" 及更高版本不需要 'u' 变体。
除了用于选择 SDK 的编译器标志外,还要添加用于创建通用二进制文件的标志
./Configure -Accflags="-arch i686 -arch ppc -nostdinc \
-B$SDK/usr/include/gcc \
-B$SDK/usr/lib/gcc -isystem$SDK/usr/include \
-F$SDK/System/Library/Frameworks" \
-Aldflags="-arch i686 -arch ppc -Wl,-syslibroot,$SDK" \
-de
请记住,这些编译器和链接器设置也将在构建 CPAN 模块时使用。为了将 XS 模块编译为通用二进制文件,它链接的任何库也必须是通用二进制文件。Apple 与 10.4u SDK 一起提供的系统库都是通用的,但用户安装的库可能需要重新安装为通用二进制文件。
按照 INSTALL 中的说明构建支持 64 位整数 (use64bitint
) 或 64 位整数和 64 位寻址 (use64bitall
) 的 Perl。在后一种情况下,生成的二进制文件将仅在基于 G5 的主机上运行。
对 64 位寻址的支持是实验性的:Perl 的某些方面可能被省略或存在错误。请注意 Configure 输出的消息以获取更多信息。如果您遇到困难,请使用 https://github.com/Perl/perl5/issues 提交问题报告。
在构建 64 位模块时,您有责任确保链接的外部库和框架提供 64 位支持:如果它们没有提供,模块构建可能看起来成功,但尝试使用该模块会导致运行时动态链接错误,以及后续测试失败。您可以使用 file
来发现库支持的体系结构
$ file libgdbm.3.0.0.dylib
libgdbm.3.0.0.dylib: Mach-O fat file with 2 architectures
libgdbm.3.0.0.dylib (for architecture ppc): Mach-O dynamically linked shared library ppc
libgdbm.3.0.0.dylib (for architecture ppc64): Mach-O 64-bit dynamically linked shared library ppc64
请注意,此问题阻止了许多特定于 Macintosh 的 CPAN 模块 (Mac::*
) 的构建,因为所需的 Apple 框架不提供 PPC64 支持。同样,来自 Fink 或 Darwinports 的下载不太可能提供 64 位支持;库必须使用适当的编译器和链接器标志从源代码重新构建。有关更多信息,请参阅 Apple 的 64 位过渡指南,网址为 https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/64bitPorting/transition/transition.html.
Mac OS X 附带一个动态加载的 libperl,但此版本的默认设置是编译一个静态 libperl。这样做的原因是预绑定。动态库可以预绑定到内存中的特定地址,以减少加载时间。为此,需要了解所有先前加载的库的位置和大小。Apple 在其整体操作系统构建过程中收集此信息,因此在构建 Perl 时可以轻松访问它,但普通用户需要付出很大努力才能获得预绑定所需的信息。
如果需要,可以覆盖默认设置并构建一个共享 libperl (Configure ... -Duseshrplib)。
在 Mac OS X 10.4 “Tiger” 及更高版本中,非预绑定库几乎没有性能损失。早期版本将比静态库或 Apple 的预绑定动态库加载时间更长。
一句话 - 不要,至少没有 *非常* 充分的理由。您的脚本可以像使用 "#!/usr/bin/perl" 一样轻松地以 "#!/usr/local/bin/perl" 开头。Apple 和其他第三方作为安装包等的一部分提供的脚本通常只在 Apple 安装的 /usr/bin/perl 中进行了测试。
如果您发现需要更新系统 Perl,值得注意的一个问题是静态库与动态库的问题。如果您使用默认的静态 libperl 进行升级,您会发现 Apple 提供的动态 libperl 不会被删除。如果在构建链接到 libperl 的应用程序时存在这两个库,ld 默认情况下会链接到动态库。因此,如果您需要用静态 libperl 替换 Apple 的动态 libperl,您需要确保在安装更新后删除旧的动态库。
如果您安装了额外的库,例如通过 Fink 安装的 GDBM(换句话说,您在/sw/lib下有库),或者将 libdlcompat 安装到/usr/local/lib,那么在运行 Configure 时,您可能需要格外小心,不要让 Configure 和 Perl 混淆要使用哪些库。混淆会导致例如“dyld”错误,例如在“make test”期间出现符号问题。最安全的做法是将 Configure 作为
Configure ... -Uloclibpth -Dlibpth=/usr/lib
运行 Configure 以使其只查看系统库。如果您有一些您确实想使用的额外库目录(例如 Panther 之前系统中的较新 Berkeley DB 库),请将它们添加到 libpth
Configure ... -Uloclibpth -Dlibpth='/usr/lib /opt/lib'
默认情况下,静态构建 Perl 可能会导致像 Tk 这样的复杂应用程序出现问题:在这种情况下,请考虑构建共享 Perl
Configure ... -Duseshrplib
但请记住,在这种情况下需要支付启动成本(请参阅上面的“libperl 和预绑定”)。
从 Tiger(Mac OS X 10.4)开始,Apple 为 eu_ES 本地化(巴斯克语-西班牙语)提供了损坏的本地化文件。在之前的 Perl 版本中,这会导致lib/locale测试失败。在当前版本的 Perl 中,通过使测试忽略损坏的本地化,这些失败已被抑制。如果您需要使用 eu_ES 本地化,您应该联系 Apple 支持。
有两种方法可以从 Perl 使用 Cocoa。Apple 的 PerlObjCBridge 模块包含在 Mac OS X 中,可以被独立脚本用来访问 Foundation(即非 GUI)类和对象。
另一种选择是 CamelBones,它是一个允许访问 Foundation 和 AppKit 类和对象的框架,因此可以在 Perl 中构建完整的 GUI 应用程序。CamelBones 可以在 SourceForge 上找到,网址为 https://www.sourceforge.net/projects/camelbones/.
不幸的是,以某种方式严重破坏 Mac OS X Perl 并不难。如果其他方法都失败了,并且您真的,真的想从头开始,甚至删除您的 Apple Perl 安装(它以某种方式已损坏),以下说明应该可以做到。请在遵循这些说明之前三思而后行:它们就像给自己做脑部手术一样。没有麻醉。如果您这样做,我们不会来修复您的系统。
首先,删除 libperl.dylib 文件。
# cd /System/Library/Perl/darwin/CORE
# rm libperl.dylib
然后删除所有文件夹中找到的 .bundle 文件。
/System/Library/Perl
/Library/Perl
例如,你可以通过以下方式找到它们:
# find /System/Library/Perl /Library/Perl -name '*.bundle' -print
完成这些操作后,你可以从操作系统介质中复制 Perl(至少需要 /System/Library/Perl 和 /usr/bin/perl),或者使用 Configure -Dprefix=/usr -Duseshrplib
从源代码重新构建 Perl。注意:-Dprefix=/usr
用于替换系统 Perl,在 Perl 5.8.1 及更高版本中效果更好,在 Perl 5.8.0 中设置并不完全正确。
CharlesSoft 的 "Pacifist" (https://www.charlessoft.com/) 是一种从操作系统介质中提取 Perl 二进制文件的好方法,无需重新安装整个操作系统。
本 README 由 Sherm Pendley <[email protected]> 编写,随后由 Dominic Dunlop <[email protected]> 和 Breno G. de Oliveira <[email protected]> 更新。"从头开始" 食谱由 John Montbriand <[email protected]> 贡献。
最后修改日期:2013-04-29。