目錄

名稱

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',這是蘋果開發者工具的一部分 - 也稱為 Xcode。從 Mac OS X 10.7 "Lion" 開始,它可以直接從https://developer.apple.com/downloads/(您需要免費帳戶登錄)下載為 'Command Line Tools' 捆綁,或作為 Xcode 套件的一部分,在 App Store 上免費提供。Xcode 是一個相當龐大的應用程式,因此除非您已經安裝或真的需要它,否則建議您從上面的鏈接單獨獲取 'Command Line Tools' 捆綁。如果您想從 Xcode 內部執行此操作,請轉到 Xcode -> 喜好設置 -> 下載並選擇 'Command Line Tools' 選項。

在 Mac OS X 10.3 "Panther" 和 10.6 "Snow Leopard" 之間,'Command Line Tools' 捆綁被稱為 'unix 工具',通常隨 Mac OS 安裝 DVD 一起提供。

早期的 Mac OS X 版本(10.2 "Jaguar" 及更早版本)並不包含完全線程安全的 libc,因此不完全支援線程。此外,較早的版本包含有缺陷的 libdb,因此已知在這些版本上一些 DB_File 測試會失敗。

安裝前綴

此版本的預設安裝位置使用了傳統的 UNIX 目錄佈局,位於 /usr/local 下。這是大多數用戶的推薦位置,並且不會影響蘋果提供的 Perl 及其模組。

使用 '/usr' 作為安裝前綴將導致目錄佈局與蘋果預設 Perl 相同,核心模組存儲在 '/System/Library/Perl/${version}' 中,CPAN 模組存儲在 '/Library/Perl/${version}' 中,並且對於存儲在文件伺服器上並被許多 Mac 使用的模組,將會添加 '/Network/Library/Perl/${version}' 到 @INC 中。

SDK 支援

首先,將 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 正確安裝,因為它應該隨著上述提到的 'Command Line Tools' 捆綁一起。最後,如果您使用的是舊版的 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" 開始,蘋果僅支援基於 Intel 的硬體。這意味著您可以安全地跳過此部分,除非您使用的是舊版的 Apple 電腦,運行的是 ppc,或者希望創建具有向後兼容性的 perl 二進制檔案。

您可以將 perl 編譯為通用二進制檔案(同時為 ppc 和 intel 架構)。在 Mac OS X 10.4 "Tiger" 中,您必須匯出 'u' 變體的 SDK

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 模組編譯為通用二進制檔案,它所連接到的任何庫也必須是通用二進制檔案。蘋果在 10.4u SDK 中包含的系統庫都是通用的,但是用戶安裝的庫可能需要重新安裝為通用二進制檔案。

64位元 PPC 支援

請依照 INSTALL 中的指示來建置 Perl,以支援 64 位元整數 (use64bitint) 或同時支援 64 位元整數和 64 位元位址 (use64bitall)。在後者的情況下,生成的二進位檔將僅適用於 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 位元的支援;這些庫必須使用適當的編譯器和連結器標誌重新編譯。更多資訊,請參閱蘋果的 64 位元過渡指南,位於 https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/64bitPorting/transition/transition.html

libperl 和 Prebinding

Mac OS X 自帶一個動態加載的 libperl,但此版本的默認是編譯一個靜態的 libperl。原因在於預綁定。動態庫可以預先綁定到記憶體中的特定地址,以減少加載時間。為此,需要知道所有先前加載的庫的位置和大小。蘋果在構建 Perl 時收集此信息作為其整體 OS 構建過程的一部分,因此可以輕鬆獲取這些信息,但普通用戶需要付出大量努力才能獲得預綁定所需的信息。

您可以覆蓋默認值,如果需要,可以建立一個共享的 libperl (Configure ... -Duseshrplib)。

在 Mac OS X 10.4 "Tiger" 和更新的版本中,非預綁定庫幾乎不會受到性能懲罰。早期版本的加載時間將比靜態庫或蘋果的預綁定動態庫長。

更新蘋果的Perl

總的來說 - 除非有非常好的理由,否則不要更新。你的腳本可以開頭為 "#!/usr/local/bin/perl",也可以開頭為 "#!/usr/bin/perl"。蘋果和其他第三方提供的安裝包中的腳本通常只與蘋果安裝的 /usr/bin/perl 測試過。

如果你發現你確實需要更新系統的Perl,一個值得注意的問題是靜態庫和動態庫的問題。如果你使用默認的靜態 libperl 進行升級,你會發現蘋果提供的動態 libperl 不會被刪除。如果在應用程序與 libperl 進行鏈接時兩個庫都存在,ld 默認將鏈接到動態庫。因此,如果你需要用靜態 libperl 替換蘋果的動態 libperl,安裝更新後一定要確保刪除舊的動態庫。

已知問題

如果你已經通過 Fink 安裝了額外的庫,比如 GDBM(換句話說,你的庫在 /sw/lib 下),或者將 libdlcompat 安裝到 /usr/local/lib,在運行 Configure 時需要格外小心,不要讓 Configure 和 Perl 混淆要使用哪些庫。混淆可能表現為 "dyld" 關於符號問題的錯誤,例如在 "make test" 過程中。最安全的方法是運行 Configure

Configure ... -Uloclibpth -Dlibpth=/usr/lib

使其只查找系統庫。如果你有一些你真正想使用的額外庫目錄(比如在 Puma 系統中的更新的 Berkeley DB 库),將這些添加到 libpth 中。

Configure ... -Uloclibpth -Dlibpth='/usr/lib /opt/lib'

默認情況下構建 Perl 靜態庫可能會導致像 Tk 這樣的複雜應用程序出現問題:在這種情況下,考慮構建共享 Perl

Configure ... -Duseshrplib

但請記住,這樣做會有啟動成本(參見上面的 "libperl 和 Prebinding")。

從 Tiger(Mac OS X 10.4)開始,蘋果為 eu_ES 地區(巴斯克-西班牙)發布了破損的區域設置文件。在以前的 Perl 發行版中,這導致 lib/locale 測試失敗。在當前的 Perl 發行版中,通過使測試忽略破損的區域設置來壓制這些失敗。如果你需要使用 eu_ES 區域設置,你應該聯繫蘋果支持。

Cocoa

從 Perl 使用 Cocoa 有兩種方式。蘋果的 PerlObjCBridge 模塊,包含在 Mac OS X 中,可以被獨立腳本用來訪問基礎(即非 GUI)類和對象。

另一種方法是 CamelBones,一個允許訪問 Foundation 和 AppKit 類和對象的框架,從而可以在 Perl 中構建完整的 GUI 應用程序。CamelBones 可以在 SourceForge 上找到,網址為 https://www.sourceforge.net/projects/camelbones/

從頭開始

不幸的是,破壞自己的 Mac OS X Perl 並不是太難。如果一切都失敗了,你真的想從頭開始並移除甚至你的蘋果 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),或者使用以下命令從源代碼重新構建 Perl:Configure -Dprefix=/usr -Duseshrplib 注意:對於 Perl 5.8.1 及更新的版本,-Dprefix=/usr 可以取代系統的 Perl,但在 Perl 5.8.0 中,這些設置並不完全正確。

CharlesSoft(https://www.charlessoft.com/)的"Pacifist"是一個從作業系統媒體中提取 Perl 二進制文件的好方法,而無需重新安裝整個作業系統。

作者

本說明文件由 Sherm Pendley <sherm@dot-app.org> 撰寫,後由 Dominic Dunlop <domo@computer.org> 和 Breno G. de Oliveira <garu@cpan.org> 更新。"從頭開始"的方法由 John Montbriand <montbriand@apple.com> 貢獻。

日期

最後修改日期為 2013-04-29。