跳至內容
GitHub 儲存庫 論壇 RSS 新聞訂閱

Crystal 1.9 的 Windows 支援

HertzDevil

隨著 Crystal 1.9 的發布,編譯器和標準函式庫在使用 MSVC 工具鏈對 x64 Windows 的第一級支援方面邁出了一大步。雖然官方的 Windows 版本尚未準備好,但只剩下少數幾個懸而未決的問題,我們預計它們將在未來幾個月內解決。這篇文章簡要概述了 1.9 已經實現的目標以及仍需實現的目標。

GUI 安裝程式

installer

這是第一個 Windows 的 GUI 安裝程式!它安裝編譯器和標準函式庫的所有第三方依賴項。它還將編譯器新增到 PATH 環境變數,設定檔案關聯,正確更新或解除安裝,並在無法偵測到 Windows SDK 或 Microsoft Visual Studio 時警告使用者。除了安裝這些 Microsoft 元件外,此設定預計在新機器上「可以直接」運作。它為較不熟悉命令列環境的 Windows Crystal 使用者提供了更簡化的體驗。

即將發布的 1.9 版本將提供此 GUI 安裝程式的下載選項。每當有小版本或修補程式版本可用時,都會在 GitHub Actions 上建立新的安裝程式,因此您通常不會看到像上面螢幕截圖那樣的每日建置安裝程式,儘管更新到或從每日版本更新應該沒有任何不同。如果您有 GitHub 帳戶,請嘗試從此 CI 執行中取得 crystal-installer 構件,並回報您發現的任何問題。您也可以嘗試使用 Inno Setup 並按照 Windows 工作流程說明,在本地建置安裝程式。

動態連結

過去三個月的大部分工作都用於盡可能無縫地支援 Windows 上的載入時動態連結。您現在可以使用 -Dpreview_dll 編譯時標誌來選擇加入實驗性的動態連結支援。更多詳細資訊可以在參考手冊中找到(1.9master)。簡單總結如下

  • @[Link("foo")] 現在會指示編譯器在靜態連結時,先搜尋 foo-static.lib,再搜尋 foo.lib;在動態連結時,先搜尋 foo-dynamic.lib,再搜尋 foo.lib,允許在同一個目錄中並排提供這兩個函式庫。
  • 靜態連結表示 /MT,而動態連結表示 /MD。您自己的 C 函式庫應該使用適當的 MSVC 連結器標誌進行建置。
  • 如果提供編譯器標誌 -Dpreview_win32_delay_load,則可以使用 CRYSTAL_LIBRARY_RPATH 建置時環境變數,將 DLL 搜尋路徑附加到預設搜尋順序之前。它的靈感來自 ELF 二進制檔的 DT_RPATH,同樣支援 $ORIGIN,啟用可重新定位的、動態連結的 Windows 二進制檔。

在 Crystal 1.9 和 1.10 上,靜態連結仍將是 Windows 的預設連結模式;編譯器標誌 -Dpreview_dll 在這些版本中啟用動態連結。之後,動態連結將成為預設值,並且將需要 --static 進行靜態連結,就像在其他系統上一樣。如果您的建置腳本依賴於此,請適當將 --static 新增到您的建置腳本中。

其他值得注意的進展

  • IO.pipe 現在是異步的 (#13362)。這在 Windows 上的一些關鍵功能中啟用了並行性,最值得注意的是將 Process 的串流管道傳輸到 IO,以及異步 Log 後端。請注意,目前 FileSTDOUT 等標準串流仍然是同步的。
  • timeout 現在在 select 運算式中可以正確運作 (#13525)。
  • Time::Location 現在可以開箱即用尊重 IANA 時區名稱 (#13517),以及沒有夏令時間轉換的本地時區 (#13516)。
  • STDINSTDOUTSTDERR 現在以二進制模式而非文字模式開啟 (#13397)。對於巨集 run 處理包含 CRLF 行尾的某些原始檔,這是必要的。
  • 現在支援 Unix 套接字,其程度為 Windows 實際實作的程度 (#13493),以及其他幾個雜項套接字 API (#13325#13326#13363#13364)。
  • 現在可以正確刪除唯讀檔案和目錄 (#13462#13626)。

剩下什麼

可以在 這個 GitHub 專案中找到 Windows 上不斷變化的未解決問題清單,我們希望在正式 Windows 版本可用之前,消除「待辦事項」和「進行中」欄。在撰寫這篇文章時,剩餘的主要問題是

  • Process.new(shell: true) 的行為 (#9030)
  • 在檔案 API 中支援長路徑 (#13420)
  • 與平台無關的浮點數 sprintf (#12473)
  • 使 /SUBSYSTEM:WINDOWS 更易於使用 (#13058#13330)
  • Process#closeProcess.run 內 (#13425)
  • crystal play (#13492) 和 crystal i (#12396)
  • 通道在 -Dpreview_mt 下無法正常運作

自上一個小版本發布以來,標準函式庫測試套件中標記為 pending_win32 的規格數量已從 35 個降至 8 個。這是快速進展的跡象,這種進展將延續到下一個開發週期。