LWN: 在 Linux 上運行 macOS 程式

  • 2019 年 10 月 25 日
  • 筆記

Darling: macOS compatibility for Linux

July 30, 2019

本文由 Sean Kerner 撰寫

目前有個名叫Darling的項目活躍度不斷提升,這個項目是希望能在Linux上提供一個針對macOS軟體的translation layer(翻譯層),有點類似Wine這個項目所做的工作。Darling比起Wine來說,成熟度差得尚遠,因此開發者們現在仍在儘力能增加更多功能,使得此項目在今後的某一天能夠對更多用戶提供幫助。

7月23日的時候,Darling發布了2019年第二季度的進展報告,整體介紹了項目當前的狀況和進展:「我們很激動的看到,在2019年第二季度(四月一日至六月三十日)期間,社區的活躍度大大提高,有眾多的pull request出現,低至底層彙編、高至例如AppKit這樣的上層架構,都有不少bug fix貢獻。」

根據項目官方網站,項目名「Darling」是"Darwin」和「Linux」的組合而成的。Darwin是macOS基金會的開源工作,主要提供了macOS底層的Unix層。

▎Licensing

Darling使用GPLv3 license,根據項目主頁上的描述,這跟Apple的End User License Agreement (EULA,終端用戶協議)並不衝突,因為它僅僅使用了Darwin裡面以開源軟體形式發布的一部分。不過Darwin本身是按照「Apple Public Source License (APSL)」協議發布的,這雖然也是一個free-software license,不過按FSF所說,它跟GPL並不相容。

在7月25日BountySource的一個issue的討論里,Richard Yao建議Darling改換為另一個license,例如LGPLv2.1,他認為這個應該跟APSL是相容的。不過Darlin的貢獻者Lubos Dolezel有不同看法,他認為可以把GPL的程式碼同其他不同license的程式碼一起分發:「如果你看看大多數的Linux分發版,你會發現一些軟體包是採用互不相容的license的。這並不是說他們就不能在同一個RPM/DEB的倉庫內共存了,也不是說你不能寫個bash腳本來調用兩種license世界的可執行程式。Darling不是僅僅一個application,而是類似於macOS的一個發行版。」

不清楚這個理由是否也能延伸到kernel module部分,因為kernel module都是採用GPL協議,但是根據Yao所說,包含了不少的XNU(Darwin kernel)程式碼,都是採用了APSL協議的。

▍Beyond Darwin

除了Darwin,還有一些工具和函數庫也用在了Darling中,包含Cocotron(一個Cocoa的開源實現,Cocoa是Apple的桌面應用程式API)。在一次採訪中,Darling的貢獻者Andrew Hyatt解釋說,這個項目可以被認為是由很多不同組件組合在一起而來的。所有在https://opensource.apple.com 上的可能可以利用的項目都被取來放在Darling項目中了:「一般是各種命令行工具,不過也確實包含一些系統庫、框架等,例如Security和libsystem。像AppKit這些,程式碼就跟Apple無關了。我們的AppKit和基礎程式碼都是基於Cocotron的源程式碼。自從我們fork出來之後,最新的cocotron程式碼又有了不少改善,我們也在逐步把這些改進拿到Darwin項目里來。我覺得目前我們所碰到的問題裡面,最主要問題還是功能不全,而顧不上是否跟其他開源程式碼保持同步。」

Appkit是一個框架,包含了很多庫函數和對象,能用來創建application的用戶介面元素。Darling已經引入了很多其他的框架,其中不少都是上個季度由貢獻者James Urquhart引入的。季度報告裡面指出Urquhart的pull request針對這許多框架也引入了更多程式碼stub。Urquhart在一次採訪中也解釋了,這些stub都是一些API函數的實現,有了它們,使用了這些API的application才能正常載入起來:「很多stub函數都僅僅是加了這個stub,沒做任何具體功能實現,因此沒法保證程式可以運行正確。所以這些stub函數僅僅是將來完整實現API的一個踏腳石。」

Urquhart貢獻的framework stub包含AGL,這是用來創建和管理OpenGL rendering context(渲染上下文)的。此外他還貢獻了很多stub函數,包括Carbon相關框架的(這是C語言的API,用來對Mac OS 8和9的應用程式確保能在Mac OS X上正常運行的),還有跟Carbon配合的Core Service framework,用來提供identity等服務的。還有ApplicationService,用來給Carbon增加更多功能。

Urquhart補充說,通常來說,他貢獻的程式碼的測試標準是能夠讓legacy application能在一定程度上運行起來,但是不包含GUI。上面提到的這些框架里增加的stub,目的就是讓相關application能夠被成功載入。

Darling的報告裡面還提到了MacOS內部的框架嵌套帶來的問題:MacOS上的一些框架,看起來好像是一個框架,其實底層是多個子框架,然後鏈接在一起,最終對外暴露成一個整體的樣子。目前Darling的編譯系統仍然沒能支援這種框架嵌套。6月份的時候,Andrew Hyatt增加了相關的支援,因此類似Accelerate這樣的系統框架就可以擁有跟macOS上相同的文件組織結構了。這是通過利用一些CMake的技巧以及細緻安排系統框架的程式碼文件結構來實現的。

▎What can you do with Darling

Darling還是跟Wine不同,沒法在Linux上運行例如Xcode IDE這樣的完整macOS GUI程式。Xcode是Apple的核心開發工具的集合,用來編譯macOS和iOS應用程式。Urquhart也說他還沒有在任何正式工作場景下用過Darling,目前他大多數修修補補的改動只是做了一個能證明理論可行而已。

雖然全GUI的application還沒法運行,不過這不代表macOS application無法運行。Hyatt解釋說,如果你想做的測試是可以在純命令行下實現的,那麼很可能能正常工作起來。「過去幾年我們花了很多精力解決了一些xcodebuild運行問題,希望能在命令行上編譯Xcode項目程式碼了,我想等這個工作正式完成的時候,就會有更多的人加入Darling項目,因為這樣就足夠讓人實現在Linux上編譯iOS/macOS的app的目標了。」

Hyatt專門提到了展示了一種有趣用法的一個Darling GitHub issue。Tom Medema在問是否能運行sketchtool,這是很流行的Sketch macOS app的命令行介面。目前bug report裡面能看到已經有不少進展,目前已經可以讓sketchtool運行起來,列印出它的使用方法的字元串了。

Darling還有一個應用場景,就是來執行32位軟體。在今年下半年會發布的macOS Catalina release里,Apple不再支援32位應用程式了。他說「對於老版本的app,我們比今後macOS有可能會擁有更好的兼容性,因為我們可以在我們API里增加更多條件判斷邏輯,從而提供一個更好的兼容層」。

展望未來,Hyatt更加期望大家能提交patch來解決他們想要在Darling上用到的application的兼容性問題。他說:「現在還很難估計需要多久才能支援完整的GUI app,可能是幾年,不確定,這應該取決於我們能吸引到多少位有時間有能力的貢獻者進來。」

總之,還需要一些時間才能看出Darling會否是一個成功的項目,希望最終能達到像Wine那樣的成功,使得大量macOS application都能在Linux上運行起來。Wine花了很多年來穩定下來,並且一直在持續開發來增加更多application的支援。對Darling來說估計也是類似的策略。可以確定的是,目前已經有一組開發者很有興趣並且全力在想辦法能讓macOS application在Linux上運行起來。

LWN文章遵循CC BY-SA 4.0許可協議。

END